2017-02-14 110 views
1

我试图递归扫描文件夹并将每个* .h文件找到的路径存储到数组中。PHP 5.6 - 函数is_dir()权限问题

function findfiles($input, &$array){ 
    $dir = scandir($input); 

    foreach($dir as $file) 
    { 
     if ($file !== "." && $file !== "..") 
     { 
      if (is_file(realpath($file)) && substr($file, -2) === ".h") 
      { 
       array_push($array, realpath($file)); 
      } 

      if (is_dir(realpath($file)) //I'M EVEN USING ABSOLUTE PATH 
      { 
       findfiles(realpath($file), $array); 
      } 
     } 
    } 
} 

$input="./" 
$array = array(); 
findfiles($input, $array); 

我想这应该工作,但功能is_dir()用于目录返回FALSE“./atest/AA”和“./atest/FolderInside”即使我有设置的所有权限。

drwxrwxrwx 2 root root 0 úno 14 18:46 AA 
drwxrwxrwx 2 root root 0 úno 14 15:12 FolderInside 

伟大工程与其他文件夹“ATEST”和“测试1”,即使他们有设置相同的权限。

drwxrwxrwx 2 root root 0 úno 14 18:46 atest 
drwxrwxrwx 2 root root 0 úno 14 15:39 test1 

请问为什么?

回答

0

事情是你不能只使用$file当调用is_file()is_dir(),因为它会搜索文件include_path(可能也在当前目录中)。正确的方法是将文件名预先加上路径名:

function findfiles($input, &$array){ 
    if (substr($input, -1) !== '/') 
     $input .= '/'; 
    $dir = scandir($input); 

    foreach($dir as $file) 
    { 
     if ($file !== "." && $file !== "..") 
     { 
      if (is_file($input.$file) && substr($input.$file, -2) === ".h") 
      { 
       array_push($array, realpath($input.$file)); 
      } 

      if (is_dir($input.$file)) 
      { 
       findfiles($input.$file, $array); 
      } 
     } 
    } 
} 

$input="./"; 
$array = []; 
findfiles($input, $array); 
+0

我修改了我的代码的错误行。其实我使用的是realpath($ file),它返回文件的完整路径。你能不能现在看看并告诉我它是否仍然不好?我想我不必使用你的方法,但非常感谢你的回应。 –

+0

'realpath'在你的代码中没有用处,因为'scandir'只返回一个没有路径的文件名列表。而'realpath'不能确定'file.h'从哪个目录来......所以如果它不存在于当前目录中,它只会返回'false'。 –

+0

谢谢你,你是对的。现在正在工作。 –