Dosya Sistemi Fonksiyonları
Nette\Utils\FileSystem, dosya sistemiyle çalışmaya yarayan kullanışlı fonksiyonlar içeren bir sınıftır. Yerleşik PHP fonksiyonlarına göre bir üstünlüğü, hata durumunda istisna fırlatmalarıdır.
Diskte dosya aramanız gerekiyorsa Finder kullanın.
Kurulum:
composer require nette/utils
Aşağıdaki örnekler, şu sınıf takma adının tanımlandığını varsayar:
use Nette\Utils\FileSystem;
İşlemler
copy (string $origin, string $target, bool $overwrite=true): void
Bir dosyayı ya da tüm bir dizini kopyalar. Varsayılan olarak var olan dosyaların ve dizinlerin üzerine yazar.
$overwrite false yapılmışsa ve hedef dosya ya da dizin $target zaten varsa,
Nette\InvalidStateException fırlatır. Hata durumunda Nette\IOException fırlatır.
FileSystem::copy('/path/to/source', '/path/to/dest', overwrite: true);
createDir (string $dir, int $mode=0777): void
Dizin yoksa, üst dizinleriyle birlikte oluşturur. Hata durumunda Nette\IOException fırlatır.
FileSystem::createDir('/path/to/dir');
delete (string $path): void
Varsa bir dosyayı ya da tüm bir dizini siler. Dizin boş değilse önce içeriğini siler. Hata durumunda
Nette\IOException fırlatır.
FileSystem::delete('/path/to/fileOrDir');
makeWritable (string $path, int $dirMode=0777, int $fileMode=0666): void
Dosya izinlerini $fileMode, dizin izinlerini $dirMode olarak ayarlar. Dizinin tüm içeriğini de
özyinelemeli olarak dolaşıp izinleri ayarlar.
FileSystem::makeWritable('/path/to/fileOrDir');
open (string $path, string $mode): resource
Bir dosyayı açar ve bir resource tanıtıcısı döndürür. $mode parametresi yerleşik fopen() fonksiyonundakiyle aynı şekilde çalışır.
Hata durumunda Nette\IOException fırlatır.
$res = FileSystem::open('/path/to/file', 'r');
read (string $file): string
$file dosyasının içeriğini okur. Hata durumunda Nette\IOException fırlatır.
$content = FileSystem::read('/path/to/file');
readLines (string $file, bool $stripNewLines=true): \Generator
Dosya içeriğini satır satır okur. Yerleşik file() fonksiyonunun aksine dosyanın tamamını belleğe
yüklemez, sürekli okur; böylece kullanılabilir bellekten büyük dosyaları da okuyabilirsiniz. $stripNewLines,
satır sonu karakterleri \r ve \n'in kaldırılıp kaldırılmayacağını belirler. Hata durumunda
Nette\IOException fırlatır.
$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
$origin ile belirtilen dosya ya da dizini $target olarak yeniden adlandırır veya taşır.
Varsayılan olarak var olan dosyaların ve dizinlerin üzerine yazar. $overwrite false yapılmışsa ve
hedef dosya ya da dizin $target zaten varsa, Nette\InvalidStateException fırlatır. Hata durumunda
Nette\IOException fırlatır.
FileSystem::rename('/path/to/source', '/path/to/dest', overwrite: true);
write (string $file, string $content, ?int $mode=0666): void
$content dizesini $file dosyasına yazar. Üst dizin yoksa otomatik olarak oluşturulur. Varsayılan
olarak dosya izinlerini de ayarlar; chmod çağrısını atlamak için $mode olarak null
verin. Hata durumunda Nette\IOException fırlatır.
FileSystem::write('/path/to/file', $content);
writeAtomic (string $file, string $content, ?int $mode=0666): void
$content dizesini $file dosyasına atomik olarak yazar: içerik önce geçici bir dosyaya yazılır,
ardından bu dosya hedefin yerini tek adımda alır. Böylece aynı anda dosyaya erişen bir okuyucu onu asla yarım yazılmış
ya da kesilmiş göremez. Bunun dışında tam olarak write() gibi davranır. Hata durumunda
Nette\IOException fırlatır.
FileSystem::writeAtomic('/path/to/file', $content);
Yollar
isAbsolute (string $path): bool
$path yolunun mutlak olup olmadığını belirler.
FileSystem::isAbsolute('../backup'); // false
FileSystem::isAbsolute('/backup'); // true
FileSystem::isAbsolute('C:/backup'); // true
isValidFilename (string $name): bool
$name değerinin, yol bilgisi içermeyen ve platformlar arası geçerli bir dosya adı olup olmadığını
denetler. Boş dizeleri, . ve .. değerlerini, denetim karakterlerini, <>:"|?*\/
karakterlerini, nokta ya da boşlukla biten adları ve Windows'un ayrılmış adlarını (CON, NUL,
COM1, …) reddeder.
FileSystem::isValidFilename('photo.jpg'); // true
FileSystem::isValidFilename('../photo.jpg'); // false
FileSystem::isValidFilename('CON'); // false
joinPaths (string …$segments): string
Tüm yol parçalarını birleştirir ve sonucu normalleştirir.
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
Yoldaki .., . ve dizin ayırıcılarını sistemin standardına göre normalleştirir.
FileSystem::normalizePath('/file/.'); // '/file'
FileSystem::normalizePath('\file\..'); // '/'
FileSystem::normalizePath('/file/../..'); // '/..'
FileSystem::normalizePath('file/../../bar'); // '../bar'
unixSlashes (string $path): string
Eğik çizgileri Unix sistemlerinde kullanılan / biçimine dönüştürür.
$path = FileSystem::unixSlashes($path);
platformSlashes (string $path): string
Eğik çizgileri geçerli platforma özgü karakterlere, yani Windows'ta \, diğer sistemlerde /
biçimine dönüştürür.
$path = FileSystem::platformSlashes($path);
resolvePath (string $basePath, string $path): string
$path yolunu $basePath temel dizinine göre çözerek nihai yolu verir. Mutlak yollar
(/foo, C:/foo) değişmeden kalır (yalnızca eğik çizgiler normalleştirilir), göreli yollar temel
yola eklenir.
// Windows'ta çıktıdaki eğik çizgiler ters yönde olurdu (\)
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'
Statik mi, Statik Olmayan mı?
Sınıfı test amacıyla kolayca başka bir sınıfla (örneğin bir mock'la) değiştirebilmek için statik olmayan biçimde kullanın:
class AnyClassUsingFileSystem
{
public function __construct(
private FileSystem $fileSystem,
) {
}
public function readConfig(): string
{
return $this->fileSystem->read(/* ... */);
}
// ...
}