Datotečni sistem

Nette\Utils\FileSystem je razred z uporabnimi funkcijami za delo z datotečnim sistemom. Ena od prednosti v primerjavi z izvornimi PHP funkcijami je, da v primeru napake sprožijo izjeme.

Če potrebujete iskati datoteke na disku, uporabite Finder.

Namestitev:

composer require nette/utils

Naslednji primeri predpostavljajo ustvarjen alias:

use Nette\Utils\FileSystem;

Manipulacija

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

Kopira datoteko ali celoten imenik. Privzeto prepiše obstoječe datoteke in imenike. S parametrom $overwrite, nastavljenim na vrednost false, sproži izjemo Nette\InvalidStateException, če ciljna datoteka ali imenik $target obstaja. Ob napaki sproži izjemo Nette\IOException.

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

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

Ustvari imenik, če ne obstaja, vključno z nadrejenimi imeniki. Ob napaki sproži izjemo Nette\IOException.

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

delete (string $path): void

Izbriše datoteko ali celoten imenik, če obstaja. Če imenik ni prazen, najprej izbriše njegovo vsebino. Ob napaki sproži izjemo Nette\IOException.

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

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

Nastavi dovoljenja datoteke na $fileMode ali imenika na $dirMode. Rekurzivno preide in nastavi dovoljenja tudi celotni vsebini imenika.

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

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

Odpre datoteko in vrne vir (resource). Parameter $mode deluje enako kot pri izvorni funkciji fopen(). V primeru napake sproži izjemo Nette\IOException.

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

read (string $file): string

Vrne vsebino datoteke $file. Ob napaki sproži izjemo Nette\IOException.

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

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

Prebere vsebino datoteke vrstico po vrstico. Za razliko od izvorne funkcije file() ne naloži celotne datoteke v pomnilnik, ampak jo bere sproti, tako da je mogoče brati tudi datoteke, večje od razpoložljivega pomnilnika. $stripNewLines pove, ali naj se odstranijo znaki konca vrstice \r in \n. V primeru napake sproži izjemo Nette\IOException.

$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

Preimenuje ali premakne datoteko ali imenik $origin. Privzeto prepiše obstoječe datoteke in imenike. S parametrom $overwrite, nastavljenim na vrednost false, sproži izjemo Nette\InvalidStateException, če ciljna datoteka ali imenik $target obstaja. Ob napaki sproži izjemo Nette\IOException.

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

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

Zapiše niz $content v datoteko $file. Ob napaki sproži izjemo Nette\IOException.

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

Poti

isAbsolute (string $path)bool

Ugotavlja, ali je pot $path absolutna.

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

joinPaths (string …$segments)string

Združi vse segmente poti in rezultat normalizira.

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

Normalizira .. in . ter ločila imenikov v poti na sistemska.

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

unixSlashes (string $path)string

Pretvori poševnice v /, ki se uporabljajo v sistemih Unix.

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

platformSlashes (string $path)string

Pretvori poševnice v znake, specifične za trenutno platformo, tj. \ v Windows in / drugje.

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

resolvePath (string $basePath, string $path)string

Izpelje končno pot iz poti $path glede na osnovni imenik $basePath. Absolutne poti (/foo, C:/foo) pusti nespremenjene (samo normalizira poševnice), relativne poti pripne k osnovni poti.

// V Windows bi bile poševnice v izpisu obrnjene (\)
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'

Statični vs nestatični pristop

Da bi lahko na primer za namene testiranja razred enostavno nadomestili z drugim (mock), ga uporabljajte nestatično:

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

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

	...
}
različica: 4.0