Verzeichnis/Dateien rekursiv durchsuchen

Hallo,

ich habe ein Wurzelverzeichnis, von dem ausgehend ich alle darin enthaltenen Textdateien nach einem bestimmten Begriff durchsuchen möchte.

Verzeichnisstruktur:
/Wurzelverzeichnis
/Wurzelverzeichnis/textdatei1.txt
/Wurzelverzeichnis/textdatei2.txt
/Wurzelverzeichnis/Ordner1/
/Wurzelverzeichnis/Ordner1/textdatei3.txt
/Wurzelverzeichnis/Ordner1/textdatei4.txt
/Wurzelverzeichnis/Ordner2/textdatei5.txt
/Wurzelverzeichnis/Ordner2/textdatei6.txt

Die Textdateien sollen per PHP nach einem bestimmten Begriff durchsucht werden und anschliessend soll die Datei mit dem Pfadnamen ausgegeben werden, die den Begriff enthält.

Ich habe nun jeweils PHP-Codeschnipsel gefunden, die das unabhängig voneinander tun, aber ich bekomme es nicht in eines zusammen.

Codeschnipsel für rekursive Anzeige von Dateien in einer Ordnerstruktur:

<?php // Sample function to recursively return all files within a directory.<br />// http://www.pgregg.com/projects/php/code/recursive\_readdir.phps

Function listdir($start\_dir='./Wurzelverzeichnis') {

 $files = array();
 if (is\_dir($start\_dir)) 
 {
 $fh = opendir($start\_dir);
 while (($file = readdir($fh)) !== false) 
 {
 # loop through the files, skipping . and .., and recursing if necessary
 if (strcmp($file, '.')==0 || strcmp($file, '..')==0) continue;
 $filepath = $start\_dir . '/' . $file;
 if ( is\_dir($filepath) )
 $files = array\_merge($files, listdir($filepath));
 else
 array\_push($files, $filepath);
 }
 closedir($fh);
 } 
 else 
 {
 # false if the function was called with an invalid non-directory argument
 $files = false;
 }

 return $files;

}

$files = listdir('./Wurzelverzeichnis');
print\_r($files);
?\>

Mit einem anderen Codeschnipsel kann ich die Dateien nach einem bestimmten String durchsuchen:

<?php $a = "test";<br />$directory = "./Wurzelverzeichnis/"; 
$handle = opendir($directory); 

while ($file = readdir ($handle)) 
{
 $file = $directory.$file;
 if (!is\_file($file)) continue;
 $fd = fopen($file,"r");
 $seite = fread ($fd, filesize ($file));
 $seite = strtolower($seite);
 fclose ($fd);

 if (strstr($seite,$a)) 
 {
 print($file);
 }
}
?\>

Wie bekomme ich das denn jetzt so zusammengebacken, dass die Textdateien des Wurzelverzeichnisses rekursiv nach einem bestimmten Begriff durchsucht werden? Oder gibt es eine ganz andere Idee? Nach 3 Stunden Basteln verliere ich langsam den Überblick…

Grüsse
schuelsche

Hallo,

Function listdir($start\_dir='./Wurzelverzeichnis', $searchtext='bla') {

 $files = array();
 if (is\_dir($start\_dir))
 {
 $fh = opendir($start\_dir);
 while (($file = readdir($fh)) !== false)
 {
 # loop through the files, skipping . and .., and
recursing if necessary
 if (strcmp($file, '.')==0 || strcmp($file, '..')==0)
continue;
 $filepath = $start\_dir . '/' . $file;
 if ( is\_dir($filepath) )
 $files = array\_merge($files, listdir($filepath));
 else 
{
 if (!is\_file($filepath)) continue;
 $fd = fopen($filepath,"r");
 $seite = fread ($fd, filesize ($file));
 $seite = strtolower($seite);
 fclose ($fd);

 if (strstr($seite,$searchtext))
 {
 array\_push($files, $filepath);
 }
}

 }
 closedir($fh);
 }
 else
 {
 # false if the function was called with an invalid


> non-directory argument

 $files = false;
 }

 return $files;
}

$files = listdir('./Wurzelverzeichnis','Bla');
print\_r($files);
?\>

Alexander

<?php :
// Sample function to recursively return all files within a directory. // http://www.pgregg.com/projects/php/code/recursive\_readdir.phps Function listdir($start\_dir='./Wurzelverzeichnis') { $files = array(); if (is\_dir($start\_dir)) { $fh = opendir($start\_dir); while (($file = readdir($fh)) !== false) { # loop through the files, skipping . and .., and recursing if necessary if (strcmp($file, '.')==0 || strcmp($file, '..')==0) continue; $filepath = $start\_dir . '/' . $file; if ( is\_dir($filepath) ) $files = array\_merge($files, listdir($filepath)); else array\_push($files, $filepath); } closedir($fh); } else { # false if the function was called with an invalid non-directory argument $files = false; } return $files; } $files = listdir('./Wurzelverzeichnis'); print\_r($files); ?\>

Nachdem du hier die Pfade aller Dateien schon ermittelt hast, kannst du sie nacheinander z.B. mit file_get_contents() auslesen und dann auf den gesuchten String prüfen.

Beispeilcode hierfür:

$gesucht="Foo";
foreach($files as $file)
{
 $content=file\_get\_contents($file);
 if (strpos($content, $gesucht)!==false)
 {
 echo $file;
 }
}

Hoffe es klappt - ist nicht getestet.

Grüße,
Klaus