![]() |
|
The symfony CookbookWie man eine Datei lokalisiert |
|
You are currently reading "The symfony Cookbook" which is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.
sfFinder Klasse 
|
This work is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Translation of this work into another language is explicitly allowed. |
Einige Skripte in Ihren Anwendungen müssen auf Dateien zurückgreifen, ohne notwendigerweise zu wissen, wo sie sich befinden. Wenn Sie bash verwenden, könnten Sie find benutzen, um sie zu finden. In symfony können Sie dies leicht über sfFinder Klasse erreichen. Eine komplizierte Suche ist eine Angelegenheit von Hinzufügen neuer Suchkriterien und das Resultat ist ein einfaches Array von Dateipfaden.
sfFinder KlasseDie sfFinder Klasse ist eine "Dateisuch"-Klasse das von Perls File::Find::Rule-Modul inspiriert wurde. Es kann entweder Dateien oder Verzeichnisse (oder beides) finden und filtert die Suche durch einen Satz selbstedefinierter Richtlinien. Die grundlegende Verwendung ist die folgende:
Erzeugen Sie ein sfFinder Objekt für Ihre Suche, indem sie die Klassenmethode type() aufrufen. Übergeben Sie als Argument was für Resultate Sie erwarten (entweder file für Dateien, dir für Verzeichnisse oder any für beides)
$finder = sfFinder::type('file');
Fügen weitere Sie Richtlinien hinzu, um Ihre Suche zu verfeinern und die Zahl der Resultate zu verringern
$finder = $finder->name('*.php');
Starten Sie die Suche indem Sie in() Methode aufrufen und das Wurzelverzeichnis des für die Suche als Argument übergeben
$files = $finder->in('/home/production/myproject');
Alle diese Methodenanrufe können an eine einzelne Zeile verkettet werden, die häufig einfacher zu lesen ist:
$files = sfFinder::type('file')->name('*.php')->in('/home/production/myproject'); // kann wie folgt gelesen werden // finde Dateien im das mit den Namen '*.php' übereinstimmen im '/home/production/myproject' Verzeichnis'
Die in() liefert ein Array mit den Dateien, das für Dateimanipulationen verwendet werden können:
foreach ($files as $file) { $handle = fopen($file, "r"); ... }
Die
sfFinderKlasse wird automatisch eingebunden, somit ist es notwendig diese in Ihrem Skript manuel ein zu binden.
Die Richtlinien, die verwendet werden, um die Suche zu verfeinern, werden über die Methodenanrufe des sfFinder Objekts definiert. Alle Methoden geben das gegenwärtige sfFinder Objekt zurück, um das einfache Anketten von Methodenaufrugen zu erlauben.
$finder1 = sfFinder::type('file')->name('*.php'); // ist ein sfFinder Objekt $finder2 = sfFinder::type('file')->name('*.php')->size('> 10K'); // ist ebenfalls ein sfFinder Objekt $files = $finder1->in('/home/production/myproject'); // ist ein Array von Dateipfaden
Alle Methoden, mit Ausnahme von der in() Methode, können mehrmals aufgerugen können.
Einige Richtlinien sind kumulativ (name() zum Beispiel) während andere destruktiv sind (wie maxdepth()). Für destruktive Richtlinien gilt nur der letzte Methodenaufruf:
// dieses filtert für die Dateinamen beide Bedingungen $finder = sfFinder::type('file')->name('*.php')->name('*Success.*'); // gleichbedeutend $finder = sfFinder::type('file')->name('*Success.php'); // hier, wird nur der letzte Anruf berücksichtigt $finder = sfFinder::type('file')->maxdepth(5)->maxdepth(3); // gleichbedeutend $finder = sfFinder::type('file')->maxdepth(3);
Um nach Dateinamen zu filtern, verwenden Sie die name() Methode mit Mustern im glob oder Regular Expression Format:
$finder = sfFinder::type('file')->name('*.php'); $finder = sfFinder::type('file')->name('/.*\.php/');
Sie können sogar bestimmte Dateinamen vom Resultat ausschließen, indem Sie die not_name() Methode aufrufen:
$finder = sfFinder::type('file')->not_name('Base*'); $finder = sfFinder::type('file')->name('/^Base.*$/');
Sie können Ihre Suche auf Dateigröße filtern, indem Sie die size() Methode verwenden, die als Argument einen Vergleich als Zeichenkette erwartet. Die Methode versteht auch konkrete Größenangaben:
// sucht nur nach Dateien die größer als 10 kilobytes sind $finder = sfFinder::type('file')->size('> 10K'); // sucht nur nach Dateien die kleiner gleich als 1 kilobytes sind $finder = sfFinder::type('file')->size('<= 1Ki'); // sucht nur nach Dateien die 123 bytes groß sind $finder = sfFinder::type('file')->size(123);
Die Symbole, die für Größeangaben verwendet werden, sind binary prefix definiert durch das internationale System der Maßeinheiten.
Voreingestellt ist eine Suche, die durch das sfFinder Objekt durchgeführt wird, rekursiv und scannt alle Unterverzeichnisse. Sie können dieses Verhalten aufheben, indem Sie die maxdepth() Methode verwenden, um die maximale Tiefe der Suche in der Dateibaumstruktur einzustellen:
// suche im Verzeichnis und in den Unterverzeichnissen $finder = sfFinder::type('file'); // suche nur in das Verzeichnis das der Methode `in()` übergeben wurde // und nicht in irgendeinem Unterverzeichnis $finder = sfFinder::type('file')->maxdepth(1);
Selbstverständlich können Sie auch eine minimale Tiefe spezifizieren, indem Sie die mindepth() Methode einsetzen.
Voreingestellt ist die minimale Tiefe 0 und die maximale Tiefe ist endlos (oder nah dran).
Wenn Sie Verzeichnisse von der Suche ausschließen möchten, können Sie zwei Methoden verwenden:
die prune() Methode stoppt die Suche im Teil der Baumstruktur, in der das Muster, das als Argument übergeben wird, gefunden wird. Sehen Sie sie als Verbot an um in das Verzeichnis zu gehen und diese zu durchsuchen.
// ignoriere den Inhalt des '.svn' Verzeichnisses $finder = sfFinder::type('any')->prune('.svn');
Der finder durchsucht nicht keins der .svn Verzeichnisse, aber die .svn Verzeichnisse selbst sind noch ein Teil der Resultate.
die Methode discard() entfernt die Dateien oder die Verzeichnisse vom Resultat die mit dem Argument übereinstimmen, aber es durchsucht weiterhin dessen Baumstrukturen.
// remove the '.svn' folders from the result // entfernt die '.svn' Verzeichnisse vom Resultat $finder = sfFinder::type('any')->discard('.svn');
Diese zwei Methoden werden häufig im Zusammenhang, wenn ein Verzeichnis und dessen Inhalte von einer Suche ausgeschlossen werden sollen, benutzt:
// entfernt die '.svn' Verzeichnisse und dessen Inhalt vom Resultat $finder = sfFinder::type('any')->prune('.svn')->discard('.svn');
Um die Dateien und die Verzeichnisse auszuschließen, die durch Versionskontrollprogramme hinzugefügt werden, liefert
sfFindereine Abkürzungmethode:ignore_version_control(). Es entfernt und blendet alle Dateien und Verzeichnisse, die wie.svn,CVS,_darcs,.arch-params,.monotoneund.bzrlauten, aus.
Die Methode in() wird benutzt, um zu spezifizieren, wo sfFinder nach Dateien oder Verzeichnissen suchen muss. Es kann einen Dateipfad oder eine Array von Dateipfaden als Argument übergeben werden:
// suche in einer einzelnen Position $files = $finder->in('/home/production/myproject'); // suche in mehreren Positionen $files = $finder->in(array('/home/production/myproject', '/home/production/myotherproject'));
Es kann entweder absoluten oder relativen Pfade annehmen:
// absoluter Pfad $files = $finder->in('/home/production/myproject'); // relativer Pfad $files = $finder->in('../projects/myproject');
Voreingesstellt sind die Pfade, die von der in()Methode zurückgegeben werden, absolut. Sie können aber auch angeben, ein Array von relativen Pfaden zu erhalten, indem Sie die relative() Methode bevor Sie die in() Methode verwenden, aufrufen:
// die Pfade sind im relativen Verhältnis zu dem Wurzelverzeichnis $files = $finder->in('/home/production/myproject'); // die Pfade sind im relativen Verhältnis zu dem aktuellen Verzeichnis directory, // d.h. das Verzeichnis des aktuellen skripts $files = $finder->relative()->in('/home/production/myproject');
If you find a typo or an error, please register and open a ticket.
If you need support or have a technical question, please post to the official user mailing-list.