Funktionen für das Dateisystem

Nette\Utils\FileSystem ist eine Klasse mit nützlichen Funktionen für die Arbeit mit dem Dateisystem. Ein Vorteil gegenüber den nativen PHP-Funktionen ist, dass sie im Fehlerfall Exceptions werfen.

Wenn Sie Dateien auf der Festplatte suchen müssen, verwenden Sie den Finder.

Installation:

composer require nette/utils

Die folgenden Beispiele setzen voraus, dass dieser Klassen-Alias definiert ist:

use Nette\Utils\FileSystem;

Manipulation

copy (string $origin, string $target, bool $overwrite=true)void

Kopiert eine Datei oder ein ganzes Verzeichnis. Bestehende Dateien und Verzeichnisse werden standardmäßig überschrieben. Ist $overwrite auf false gesetzt und die Zieldatei bzw. das Zielverzeichnis $target existiert bereits, wirft die Methode eine Nette\InvalidStateException. Im Fehlerfall wirft sie eine Nette\IOException.

FileSystem::copy('/path/to/source', '/path/to/dest', overwrite: true);

createDir (string $dir, int $mode=0777)void

Erzeugt ein Verzeichnis, wenn es nicht existiert, samt der übergeordneten Verzeichnisse. Im Fehlerfall wirft die Methode eine Nette\IOException.

FileSystem::createDir('/path/to/dir');

delete (string $path): void

Löscht eine Datei oder ein ganzes Verzeichnis, sofern es existiert. Ist das Verzeichnis nicht leer, löscht die Methode zuerst seinen Inhalt. Im Fehlerfall wirft sie eine Nette\IOException.

FileSystem::delete('/path/to/fileOrDir');

makeWritable (string $path, int $dirMode=0777, int $fileMode=0666)void

Setzt die Rechte einer Datei auf $fileMode bzw. die eines Verzeichnisses auf $dirMode. Sie durchläuft rekursiv den gesamten Inhalt eines Verzeichnisses und setzt auch dort die Rechte.

FileSystem::makeWritable('/path/to/fileOrDir');

open (string $path, string $mode): resource

Öffnet eine Datei und gibt ein Resource-Handle zurück. Der Parameter $mode funktioniert genauso wie bei der nativen Funktion fopen(). Im Fehlerfall wirft die Methode eine Nette\IOException.

$res = FileSystem::open('/path/to/file', 'r');

read (string $file): string

Liest den Inhalt der Datei $file. Im Fehlerfall wirft die Methode eine Nette\IOException.

$content = FileSystem::read('/path/to/file');

readLines (string $file, bool $stripNewLines=true): \Generator

Liest den Inhalt der Datei Zeile für Zeile. Anders als die native Funktion file() lädt sie nicht die gesamte Datei in den Speicher, sondern liest sie fortlaufend, sodass sich auch Dateien lesen lassen, die größer als der verfügbare Speicher sind. $stripNewLines bestimmt, ob die Zeilenumbruchzeichen \r und \n entfernt werden. Im Fehlerfall wirft die Methode eine Nette\IOException.

$lines = FileSystem::readLines('/path/to/file');

foreach ($lines as $lineNum => $line) {
	echo "Zeile $lineNum: $line\n";
}

rename (string $origin, string $target, bool $overwrite=true)void

Benennt die durch $origin angegebene Datei oder das Verzeichnis in $target um oder verschiebt sie dorthin. Bestehende Dateien und Verzeichnisse werden standardmäßig überschrieben. Ist $overwrite auf false gesetzt und die Zieldatei bzw. das Zielverzeichnis $target existiert bereits, wirft die Methode eine Nette\InvalidStateException. Im Fehlerfall wirft sie eine Nette\IOException.

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. Existiert das übergeordnete Verzeichnis nicht, wird es automatisch angelegt. Standardmäßig setzt die Methode auch die Rechte der Datei; übergeben Sie null als $mode, um den Aufruf von chmod zu überspringen. Im Fehlerfall wirft sie eine Nette\IOException.

FileSystem::write('/path/to/file', $content);

writeAtomic (string $file, string $content, ?int $mode=0666)void

Schreibt den String $content atomar in die Datei $file: Der Inhalt wird zuerst in eine temporäre Datei geschrieben, die das Ziel dann in einem einzigen Schritt ersetzt. Ein Leser, der im selben Moment auf die Datei zugreift, kann sie deshalb nie halb geschrieben oder abgeschnitten sehen. Ansonsten verhält sie sich genau wie write(). Im Fehlerfall wirft sie eine Nette\IOException.

FileSystem::writeAtomic('/path/to/file', $content);

Pfade

isAbsolute (string $path)bool

Ermittelt, ob der Pfad $path absolut ist.

FileSystem::isAbsolute('../backup'); // false
FileSystem::isAbsolute('/backup');   // true
FileSystem::isAbsolute('C:/backup'); // true

isValidFilename (string $name)bool

Prüft, ob $name ein plattformübergreifend gültiger Dateiname ohne Pfadangabe ist. Abgelehnt werden leere Strings, . und .., Steuerzeichen, die Zeichen <>:"|?*\/, Namen, die auf einen Punkt oder ein Leerzeichen enden, sowie unter Windows reservierte Namen (CON, NUL, COM1, …).

FileSystem::isValidFilename('photo.jpg');    // true
FileSystem::isValidFilename('../photo.jpg'); // false
FileSystem::isValidFilename('CON');          // false

joinPaths (string …$segments)string

Fügt alle Pfadsegmente zusammen 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 die Verzeichnistrenner im Pfad auf den Standard des Systems.

FileSystem::normalizePath('/file/.');        // '/file'
FileSystem::normalizePath('\file\..');       // '/'
FileSystem::normalizePath('/file/../..');    // '/..'
FileSystem::normalizePath('file/../../bar'); // '../bar'

unixSlashes (string $path)string

Wandelt die Schrägstriche in das auf Unix-Systemen verwendete / um.

$path = FileSystem::unixSlashes($path);

platformSlashes (string $path)string

Wandelt die Schrägstriche in die Zeichen um, die für die aktuelle Plattform typisch sind, also \ unter Windows und / anderswo.

$path = FileSystem::platformSlashes($path);

resolvePath (string $basePath, string $path)string

Ermittelt den endgültigen Pfad aus $path relativ zum Basisverzeichnis $basePath. Absolute Pfade (/foo, C:/foo) bleiben unverändert (nur die Schrägstriche werden normalisiert), relative Pfade werden an den Basispfad angehängt.

// Unter Windows wären die Schrägstriche in der Ausgabe umgedreht (\)
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 Ansatz

Damit sich die Klasse für Tests leicht durch eine andere (etwa einen Mock) ersetzen lässt, verwenden Sie sie nicht statisch:

class AnyClassUsingFileSystem
{
	public function __construct(
		private FileSystem $fileSystem,
	) {
	}

	public function readConfig(): string
	{
		return $this->fileSystem->read(/* ... */);
	}

	// ...
}
Version: 4.x