Verzeichnis rekursiv nach String durchsuchen

…und Ordner ausgeben.

Moin, moin,

Ich häng jetzt schon ein paar Tage an einem Problem und habe zig Foren durchsucht, aber nirgends find ich grundlegend eine Lösung.

Und zwar habe ich eine Abfrage aus MySql, das Ergebnis sind Files welche auf einem Share in Ordner liegen.

Anhand der Ausgabe der Abfrage kann ich den Pfad ermitteln und einen Teil des Datei-Inhalts (Subject)

$pfad\_erhalten = str\_replace(" ", "", $pfad\_erhalten);
echo "[$pfad\_erhalten](%2524pfad_download)";

Der lautet in etwa so… *e:\Datum\Kunde1*

In diesem Ordner befinden sich zig Unterordner und in diesen mehrer einzelne Files, eine davon hat den o. g. Subject.

Nun das Problem -->(Soweit versteh ichs noch) Also

  1. durchsuche rekursiv den Pfad *e:\Datum\Kunde1*
  2. öffne jede Datei und suche nach dem String (Subect)
  3. wenn vorhanden --> STOPP und gebe den Pfad *e:\Datum\Kunde1* + Unterordner aus.
    ODER 4) wenn nix drin nimm den nächsten Unterordner und …siehe 2…und 3…bis gefunden.
    Der Subject MUSS in einer der Files sein, anonsten hätte mir die SQL-Abfrage den Subject ned ausgegeben, also kanns ein false ned das Ergebnis sein.

Jemand Lust mir auf die Sprünge zu helfen?

Also fopen etc kann ich. Nur eben das alles oben im Zusammenhang…da steig ich leider nicht durch.

Gruß Rolf

Hallo

…und Ordner ausgeben.
Ich häng jetzt schon ein paar Tage an einem Problem und habe
zig Foren durchsucht, aber nirgends find ich grundlegend eine
Lösung.

Hmmm.

Und zwar habe ich eine Abfrage aus MySql, das Ergebnis sind
Files welche auf einem Share in Ordner liegen.
Anhand der Ausgabe der Abfrage kann ich den Pfad ermitteln und
einen Teil des Datei-Inhalts (Subject)

Hmmm. Also „Subject“ ist das, wonach Du suchst? Also
eine Art „Suchmuster“?

$pfad_erhalten = str_replace(" ", „“, $pfad_erhalten);
echo „$pfad_erhalten“;

Der lautet in etwa so… *e:\Datum\Kunde1*
In diesem Ordner befinden sich zig Unterordner und in diesen
mehrer einzelne Files, eine davon hat den o. g. Subject.

Aha

Nun das Problem -->(Soweit versteh ichs noch) Also

  1. durchsuche rekursiv den Pfad *e:\Datum\Kunde1*
  2. öffne jede Datei und suche nach dem String (Subect)
  3. wenn vorhanden --> STOPP und gebe den Pfad
    *e:\Datum\Kunde1* + Unterordner aus.
    ODER 4) wenn nix drin nimm den nächsten Unterordner und
    …siehe 2…und 3…bis gefunden.
    Der Subject MUSS in einer der Files sein, anonsten hätte mir
    die SQL-Abfrage den Subject ned ausgegeben, also kanns ein
    false ned das Ergebnis sein.

Jemand Lust mir auf die Sprünge zu helfen?

Naja, so schwer wird das nicht sein. Ich würde
erstmal eine einfache Variante vorgeben …

 $suchmuster = '/Hallo!/';
 $pfad\_erhal = ' e:\Datum\Kunde1\ '; # '', '|\\\\|' =\> '/', '|/+$|' =\> '');
 $pfad\_download = preg\_replace(array\_keys($repl), array\_values($repl), $pfad\_erhal);

 echo "[$pfad\_erhal](%255C%2522%2524pfad_download%255C%2522)\n";
 echo "suche nach: $suchmuster\n";

 find($pfad\_download, 'wanted');

 function wanted($filename) # was soll mit der Datei gemacht werden
{
 global $suchmuster;
 $content = file\_get\_contents($filename);
 if(preg\_match($suchmuster, $content, $m, PREG\_OFFSET\_CAPTURE))
 echo "$filename =\> pos {$m[0][1]}\n";
}

 function find($dir, $procname) # rekursive Suche, Aufruf pro Datei mit procname()
{
 $dh = opendir($dir) or die("Pfad '$pfad' glabbt nich so!");
 while($fn = readdir($dh))
 if(!preg\_match('/^\.\.?$/', $fn, $m)) # . und .. ignorieren
 is\_dir("$dir/$fn") ? find("$dir/$fn", $procname) : $procname("$dir/$fn");
 closedir( $dh );
}

… die Du dann für Deine Problemstellung erweitern
könntest.

Grüße

CMБ

Moin, moin

danke für deine Tipp, nur löfft das ganze nicht so.
Ich erkläre nochmal kurz genauer was ich will (und was ich hab :smile:)

Also die MySQL-Abfrage gibt mir folgendes aus -->


subject |datum_erhalten|firmename| und noch n paar mehr

die aber vorerst nicht wichtig sind.

Aus datum_erhalten und firmennamen und eines Laufwerksbuchstaben, der immer gleich ist, weiss ich den Pfad
–> d:\090425\mueller\

Hallo Rolf,

also willst Du uns sagen, was denn falsch läuft oder nicht? Leider kann man Dir wegen der nicht ausgefüllten Vita kaum zielgerichtete Hilfe anbieten.

In deinem Source - was davon ist mein Suchbegriff (Subject)
und was davon mein Pfad?

Der Sourcecode ist im Detail nicht schnell erfassbar (zumindestens brauchte ich selbst eine Gedenkminute zur Analyse), aber die Variablenname sind doch offensichtlich gewählt. Kopiere doch den Source-Code und teste ihn (nach Anpassung) aus.

Kleiner Hinweis: Semjon geht im Gegensatz zu Dir von potentiell mehreren Suchergebnissen aus und ruft deshalb eine Funktion auf statt das Suchergebnis in eine Variable zu schreiben. Das kann man natürlich ändern.

MfG Georg V.

Hallo

danke für deine Tipp, nur löfft das ganze nicht so.
Ich erkläre nochmal kurz genauer was ich will (und was ich hab

OK

Also die MySQL-Abfrage gibt mir folgendes aus -->

subject |datum_erhalten|firmename| und noch n paar mehr

die aber vorerst nicht wichtig sind.
Aus datum_erhalten und firmennamen und eines
Laufwerksbuchstaben, der immer gleich ist, weiss ich den Pfad
–> d:\090425\mueller\ $suchmuster

und der Pfad ist $pfad_erhal
und der komplette Dateiname einer jeweils
gefundenen Übereinstimmung ist $filename ;
in der Funktion wanted().

Grüße

CMБ

Ich erkläre nochmal kurz genauer was ich will (und was ich hab

OK
Also die MySQL-Abfrage gibt mir folgendes aus -->

subject |datum_erhalten|firmename| und noch n paar mehr

die aber vorerst nicht wichtig sind.
Aus datum_erhalten und firmennamen und eines
Laufwerksbuchstaben, der immer gleich ist, weiss ich den Pfad
–> d:\090425\mueller\
quasi --> $pfad_erhalten = str_replace(" ", „“, $pfad_erhalten);
echo „$pfad_erhalten“;

der sieht als echo ausgegben so aus (das is nur ein Beispiel
bis auf den Laufwerksbuchstaben ist der Pfad NICHT konstant)

e:\090425\mueller\UNTERORDNER(UNTER-UNTERODNER)

+++
Woher kommt dann D: oder E: usw
+++
Wie erwähnt - der ist konstant!
+++

In jedem dieser Unter-Ordner oder Unter-Unter-Ordner befinden
2 oder 4 Files, davon ein File das o. g. Subject -
alphanummerisch.

OK. Bezieht sich „Subject“ auf File-„Name“
oder File-„Inhalt“?
Nun will ich eben das er mir die Ordner nach dem Subject
durchsucht und dann den Unter-Ordner bzw. Unter-Unter-Ordner
ausgibt.

+++
Mein Such-String, also das Suchwort, nehme ich auch aus der DB-
Abfrage (Subject) Dieser Subject ist ein Teil der Dateiinhaltes,
also nicht der Dateiname!
+++

OK
Am besten in ner Variablen denn der muss dann kopiert werden.
(das ist dann auch wieder kein Problem)

OK
In deinem Source - was davon ist mein Suchbegriff (Subject)
und was davon mein Pfad?

Der Suchbegriff ist $suchmuster
++++
Achja, mein Suchbegriff laute hier $subject…

+++++
und der Pfad ist $pfad_erhal
und der komplette Dateiname einer jeweils
gefundenen Übereinstimmung ist $filename;
in der Funktion wanted().

Gruß Rolf

Hallo Georg,

es kann nur einen Suchtreffer geben.
Die Datei mit dem Subject ist hir im Grunde ein Zertifikat.

Gruß Rolf

Achja, ausgeben tut er mir -->

Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\user.php on line 238

PHP ist Version 5.2…

Warum er hier alphanumeric anmäkelt…keine Ahnung.

Gruß Rolf

Moin moin,

also ich habe deine Code nun angepasst -->

 $suchmuster = $\_SESSION['datei\_no'];
 $pfad\_erhal = $pfad\_erhalten; # '', '|\\\\|' =\> '/', '|/+$|' =\> '');
 $pfad\_erhalten= preg\_replace(array\_keys($repl), array\_values($repl), $pfad\_erhal);

 echo "[$pfad\_erhal](%255C%2522%2524pfad_erhalten%255C%2522)\n";

 echo " **Suche in:** $pfad\_erhal"; 
 echo "
";
 echo " **nach:** $suchmuster\n";

 find($pfad\_erhalten, 'wanted');

 function wanted($filename) # was soll mit der Datei gemacht werden
{
 global $suchmuster;
 $content = file\_get\_contents($filename);
 if(preg\_match($suchmuster, $content, $m, PREG\_OFFSET\_CAPTURE))
 echo "$filename =\> pos {$m[0][1]}\n";
}

 function find($dir, $procname) # rekursive Suche, Aufruf pro Datei mit procname()
{
 $dh = opendir($dir) or die("Pfad '$pfad\_erhalten' glabbt nich so!");
 while($fn = readdir($dh))
 if(!preg\_match('/^\.\.?$/', $fn, $m)) # . und .. ignorieren
 is\_dir("$dir/$fn") ? find("$dir/$fn", $procname) : $procname("$dir/$fn");
 closedir( $dh );
}

Fehler --> Fatal error: Call to undefined function find() in C:\xampp\htdocs\user.php on line 235

Meine Zeile 235 ist --> find($pfad_erhalten, ‚wanted‘);

Warum ist der nun nicht definiert? HÜÜÜÜÜÜLFE!!!

Gruß Rolf

Hallo

also ich habe deine Code nun angepasst -->

Fehler --> Fatal error: Call to undefined function find()
in C:\xampp\htdocs\user.php on line 235

Meine Zeile 235 ist --> find($pfad_erhalten, ‚wanted‘);

Warum ist der nun nicht definiert? HÜÜÜÜÜÜLFE!!!

Keine Ahnung. Dreh mal die Reihenfolge von Code
und Funktionen um:

<?php # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #<br /> function wanted($filename, &$hit) # was soll mit der Datei gemacht werden
{
 global $Suchmuster;
 $content = file\_get\_contents($filename);
 if(preg\_match($Suchmuster, $content, $m)) $hit [] = $filename;
}

 function find\_one($dir, $procname, &$hit) # rekursive Suche, Aufruf: procname()
{
 $dh = opendir($dir) or die("Pfad '$dir' glabbt nich so!");
 while( !sizeof($hit) && ($fn=readdir($dh)) )
 if(!preg\_match('/^\.\.?$/', $fn, $m)) # . und .. ignorieren
 is\_dir("$dir/$fn") ? find\_one("$dir/$fn", $procname, $hit)
 : $procname("$dir/$fn", $hit);
 closedir($dh);
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #

 $pfad\_erhalten = ' d:\090425\mueller\ ';
 $repl = Array('|\s+|' =\> '', '|\\\\|' =\> '/', '|/+$|' =\> ''); # Pfad saeubern
 $pfad\_download=preg\_replace(array\_keys($repl),array\_values($repl),$pfad\_erhalten);
 # Pfad sollte jetzt "kanonisiert" ond fehlerfrei sein

 $subject = $\_SESSION['datei\_no']; # Beispiel für Subject
 $Suchmuster = '/' . preg\_quote($subject, '/') . '/'; # Subject saeubern
 echo "suche in $pfad\_download nach: $Suchmuster\n";

 $Resultat = Array(); # Array aus Gruenden der Bequemlichkeit
 find\_one($pfad\_download, 'wanted', $Resultat);
 print\_r($Resultat);
 
?\>

Grüße

CMБ

1 Like

Joap!
Danke, jetzt rennts :smile:

Subba.
Jetzt hab ich auch noch n anderes Problem.
Aber das krieg ich auch noch hin.

Gruß Rolf