Übersicht
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.
Die sfFinder
Klasse
Die 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 Klassenmethodetype()
aufrufen. Übergeben Sie als Argument was für Resultate Sie erwarten (entwederfile
für Dateien,dir
für Verzeichnisse oderany
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"); ... }
note
Die sfFinder
Klasse wird automatisch eingebunden, somit ist es notwendig diese in Ihrem Skript manuel ein zu binden.
Die Grundsätze der Richtlinien
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);
Filter-Regeln
Nach Namen filtern
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.*$/');
Nach Dateigröße filtern
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.
Die Suchtiefe begrenzen
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).
Verzeichnisse ausschließen
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');
tip
Um die Dateien und die Verzeichnisse auszuschließen, die durch Versionskontrollprogramme hinzugefügt werden, liefert sfFinder
eine Abkürzungmethode: ignore_version_control()
. Es entfernt und blendet alle Dateien und Verzeichnisse, die wie .svn
, CVS
, _darcs
, .arch-params
, .monotone
und .bzr
lauten, aus.
Ausgangspunkt der Suche
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');
Das zurückgeben der relativen Pfade
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');
This work is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.