PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzeichnis / Dateien rekursiv durchsuchen



schuelsche
12-06-2007, 15:23
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.
// 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";
$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

jeebee
12-06-2007, 15:46
zb so:
<?php
Function find_string($files, $string) {
foreach($files as $file) {
$fd = fopen($file,"r");
$seite = fread ($fd, filesize ($file));
$seite = strtolower($seite);
fclose ($fd);

if (strstr($seite,$string))
{
print($file);
}
}

$files = listdir("./Wurzelverzeichnis");
find_string($files, "foo");
?>

Habs nicht getestet und ist auch schon ne Weile her, dass ich das letze Mal ernsthaft was mit PHP gemacht hab.

schuelsche
13-06-2007, 08:21
Vielen Dank, das könnte die Lösung sein.

Nach ein bisschen testen glaube ich jedoch, dass auf diese Art nur das erste File angezeigt wird, in dem ein bestimmter Begriff vorhanden ist. Kann man das noch so umschreiben, dass er die Schleife so oft durchläuft, bis er keinen Begriff mehr findet... vielleicht doch irgendwie mit der while-Schleife? Denn ein Begriff kommt unter Umständen in mehreren Dokumenten vor und ich will alle anzeigen lassen.

Grüsse
schuelsche

jeebee
13-06-2007, 11:33
foreach sollte eigentlich jedes Element (Dateiname) im Array $files einmal in die Variable $file schreiben und dann die entsprechende Datei öffnen und im Inhalt nach $string suchen.

Hmm, ich sehe gerade, in meinem Code fehlt eine geschweifte Klammer:

<?php
Function find_string($files, $string) {
foreach($files as $file) {
$fd = fopen($file,"r");
$seite = fread ($fd, filesize ($file));
$seite = strtolower($seite);
fclose ($fd);

if (strstr($seite,$string))
{
print($file);
}
}
}

$files = listdir("./Wurzelverzeichnis");
find_string($files, "foo");
?>

Vielleicht war das das Problem.