2017-02-14 2 views
1

Ich versuche, Ordner rekursiv zu scannen und jeden gefundenen * .h Dateipfad in einem Array zu speichern.PHP 5.6 - Funktion is_dir() Berechtigungen Problem

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); 

Ich denke, das sollte funktionieren, aber Funktion is_dir() gibt FALSE für Verzeichnisse „./atest/AA“ und „./atest/FolderInside“ auch wenn ich gesetzt, alle Berechtigungen verfügen.

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

und funktioniert gut mit anderen Ordnern "Atest" und "Test1" sogar sie haben die gleichen Berechtigungen gesetzt.

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

Bitte warum?

Antwort

0

Die Sache ist, dass Sie nicht nur $file verwenden können, wenn is_file() oder is_dir() nennen, weil er die Datei in include_path (möglicherweise auch in der aktuellen Verzeichnis) suchen würde. Der korrekte Weg wäre, Dateiname mit dem Pfadnamen voran zu stellen:

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

Ich habe die falsche Zeile meines Codes geändert. Tatsächlich benutze ich realpath ($ file), das den vollständigen Pfad der Datei zurückgibt. Könntest du bitte einen Blick darauf werfen und mir sagen, ob es immer noch schlecht ist? Ich denke, ich muss Ihre Methode nicht verwenden, aber vielen Dank für Ihre Antwort. –

+0

'realpath' ist in Ihrem Code nicht von Nutzen, da' scandir' nur eine Liste von Dateinamen ohne Pfade zurückgibt. Und 'realpath' kann nicht feststellen, aus welchem ​​Verzeichnis das' file.h' kommt ... Wenn es also nicht im aktuellen Verzeichnis vorhanden ist, gibt es nur 'false' zurück. –

+0

Danke, Sie haben Recht. Es funktioniert jetzt. –