Dateisystem
Nette\Utils\FileSystem ist eine Klasse, die nützliche Funktionen für die Arbeit mit dem Dateisystem bereitstellt. Ein Vorteil gegenüber nativen PHP-Funktionen ist, dass sie im Fehlerfall Ausnahmen auslösen.
Wenn Sie nach Dateien auf der Festplatte suchen müssen, verwenden Sie den Finder.
Installation:
composer require nette/utils
Die folgenden Beispiele setzen voraus, dass der folgende Alias definiert wurde:
use Nette\Utils\FileSystem;
Manipulation
copy (string $origin, string $target, bool $overwrite=true): void
Kopiert eine Datei oder ein ganzes Verzeichnis. Standardmäßig werden vorhandene Dateien und Verzeichnisse überschrieben.
Wenn der Parameter $overwrite
auf false
gesetzt ist und die Zieldatei oder das Zielverzeichnis
$target
bereits existiert, wird eine Nette\InvalidStateException
ausgelöst. Bei anderen Fehlern wird
eine Nette\IOException
ausgelöst.
FileSystem::copy('/path/to/source', '/path/to/dest', overwrite: true);
createDir (string $dir, int $mode=0777): void
Erstellt ein Verzeichnis $dir
, falls es nicht existiert, einschließlich aller übergeordneten Verzeichnisse. Bei
einem Fehler wird eine Nette\IOException
ausgelöst.
FileSystem::createDir('/path/to/dir');
delete (string $path): void
Löscht eine Datei oder ein ganzes Verzeichnis $path
, falls vorhanden. Wenn das Verzeichnis nicht leer ist, wird
zuerst sein Inhalt gelöscht. Bei einem Fehler wird eine Nette\IOException
ausgelöst.
FileSystem::delete('/path/to/fileOrDir');
makeWritable (string $path, int $dirMode=0777, int $fileMode=0666): void
Setzt die Berechtigungen für eine Datei auf $fileMode
oder für ein Verzeichnis auf $dirMode
.
Durchläuft rekursiv den Pfad $path
und setzt die Berechtigungen auch für den gesamten Inhalt des
Verzeichnisses.
FileSystem::makeWritable('/path/to/fileOrDir');
open (string $path, string $mode): resource
Öffnet eine Datei $path
und gibt eine Ressource zurück. Der Parameter $mode
funktioniert genauso
wie bei der nativen Funktion fopen()
. Bei einem Fehler
wird eine Nette\IOException
ausgelöst.
$res = FileSystem::open('/path/to/file', 'r');
read (string $file): string
Gibt den Inhalt der Datei $file
zurück. Bei einem Fehler wird eine Nette\IOException
ausgelöst.
$content = FileSystem::read('/path/to/file');
readLines (string $file, bool $stripNewLines=true): \Generator
Liest den Inhalt der Datei $file
Zeile für Zeile. Im Gegensatz zur nativen Funktion file()
wird
nicht die gesamte Datei in den Speicher geladen, sondern sie wird fortlaufend gelesen, sodass auch Dateien gelesen werden können,
die größer als der verfügbare Speicher sind. $stripNewLines
gibt an, ob die Zeilenendezeichen \r
und
\n
entfernt werden sollen (true
standardmäßig). Bei einem Fehler wird eine
Nette\IOException
ausgelöst.
$lines = FileSystem::readLines('/path/to/file');
foreach ($lines as $lineNum => $line) {
echo "Line $lineNum: $line\n";
}
rename (string $origin, string $target, bool $overwrite=true): void
Benennt eine Datei oder ein Verzeichnis $origin
in $target
um oder verschiebt es. Standardmäßig
werden vorhandene Dateien und Verzeichnisse überschrieben. Wenn der Parameter $overwrite
auf false
gesetzt ist und die Zieldatei oder das Zielverzeichnis $target
bereits existiert, wird eine
Nette\InvalidStateException
ausgelöst. Bei anderen Fehlern wird eine Nette\IOException
ausgelöst.
FileSystem::rename('/path/to/source', '/path/to/dest', overwrite: true);
write (string $file, string $content, int $mode=0666): void
Schreibt den String $content
in die Datei $file
. Setzt optional die Berechtigungen
$mode
. Bei einem Fehler wird eine Nette\IOException
ausgelöst.
FileSystem::write('/path/to/file', $content);
Pfade
isAbsolute (string $path): bool
Prüft, ob der Pfad $path
absolut ist.
FileSystem::isAbsolute('../backup'); // false
FileSystem::isAbsolute('/backup'); // true
FileSystem::isAbsolute('C:/backup'); // true
joinPaths (string …$segments): string
Verbindet alle Pfadsegmente und normalisiert das Ergebnis.
FileSystem::joinPaths('a', 'b', 'file.txt'); // 'a/b/file.txt'
FileSystem::joinPaths('/a/', '/b/'); // '/a/b/'
FileSystem::joinPaths('/a/', '/../b'); // '/b'
normalizePath (string $path): string
Normalisiert ..
und .
sowie Verzeichnistrennzeichen im Pfad auf die systemüblichen.
FileSystem::normalizePath('/file/.'); // '/file/'
FileSystem::normalizePath('\file\..'); // '/file'
FileSystem::normalizePath('/file/../..'); // '/..'
FileSystem::normalizePath('file/../../bar'); // '/../bar'
unixSlashes (string $path): string
Konvertiert Schrägstriche in /
, die in Unix-Systemen verwendet werden.
$path = FileSystem::unixSlashes($path);
platformSlashes (string $path): string
Konvertiert Schrägstriche in die für die aktuelle Plattform spezifischen Zeichen, d.h. \
unter Windows und
/
anderswo.
$path = FileSystem::platformSlashes($path);
resolvePath (string $basePath, string $path): string
Löst den Pfad $path
relativ zum Basisverzeichnis $basePath
auf und gibt den endgültigen Pfad
zurück. Absolute Pfade (/foo
, C:/foo
) bleiben unverändert (nur Schrägstriche werden normalisiert),
relative Pfade werden an den Basispfad angehängt.
// Unter Windows wären die Schrägstriche in der Ausgabe umgekehrt (\)
FileSystem::resolvePath('/base/dir', '/abs/path'); // '/abs/path'
FileSystem::resolvePath('/base/dir', 'rel'); // '/base/dir/rel'
FileSystem::resolvePath('base/dir', '../file.txt'); // 'base/file.txt'
FileSystem::resolvePath('base', ''); // 'base'
Statischer vs. nicht-statischer Zugriff
Um die Klasse beispielsweise zu Testzwecken einfach durch eine andere (einen Mock) ersetzen zu können, verwenden Sie sie nicht-statisch:
class AnyClassUsingFileSystem
{
public function __construct(
private FileSystem $fileSystem,
) {
}
public function readConfig(): string
{
return $this->fileSystem->read(/* ... */);
}
...
}