Caution: You are browsing the legacy symfony 1.x part of this website.

Wie man eine Datei lokalisiert

1.2
Symfony version
1.1
Language

Ü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:

  1. 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');
  2. Fügen weitere Sie Richtlinien hinzu, um Ihre Suche zu verfeinern und die Zahl der Resultate zu verringern

    $finder = $finder->name('*.php');
  3. 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');