Verzeichnis/Dateien rekursiv durchsuchen

Von: , Frage gestellt am Mi, 13. Jun 2007

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_re...

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

2 Antworten zu dieser Frage

  1. Antwort von nach 41 Minuten 0 hilfreich
    Re: Verzeichnis/Dateien rekursiv durchsuchen

    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

  2. Antwort von nach 42 Minuten 0 hilfreich
    Re: Verzeichnis/Dateien rekursiv durchsuchen

    <?php
    
    // Sample function to recursively return all files within a
    directory.
    //
    http://www.pgregg.com/projects/php/code/recursive_re...
    
    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

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!