Sistema de archivos

Nette\Utils\FileSystem es una clase con funciones útiles para trabajar con el sistema de archivos. Una de las ventajas sobre las funciones nativas de PHP es que lanzan excepciones en caso de error.

Si necesitas buscar archivos en el disco, usa Finder.

Instalación:

composer require nette/utils

Los siguientes ejemplos asumen que se ha creado un alias:

use Nette\Utils\FileSystem;

Manipulación

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

Copia un archivo o un directorio completo. Por defecto, sobrescribe los archivos y directorios existentes. Con el parámetro $overwrite establecido en false, lanza una excepción Nette\InvalidStateException si el archivo o directorio de destino $target existe. En caso de error, lanza una excepción Nette\IOException.

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

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

Crea un directorio si no existe, incluyendo los directorios padres. En caso de error, lanza una excepción Nette\IOException.

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

delete (string $path): void

Elimina un archivo o un directorio completo si existe. Si el directorio no está vacío, elimina primero su contenido. En caso de error, lanza una excepción Nette\IOException.

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

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

Establece los permisos del archivo a $fileMode o del directorio a $dirMode. Recorre recursivamente y establece los permisos también para todo el contenido del directorio.

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

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

Abre un archivo y devuelve un resource. El parámetro $mode funciona igual que en la función nativa fopen(). En caso de error, lanza una excepción Nette\IOException.

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

read (string $file): string

Devuelve el contenido del archivo $file. En caso de error, lanza una excepción Nette\IOException.

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

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

Lee el contenido del archivo línea por línea. A diferencia de la función nativa file(), no carga todo el archivo en memoria, sino que lo lee continuamente, por lo que es posible leer archivos más grandes que la memoria disponible. $stripNewLines indica si se deben eliminar los caracteres de fin de línea \r y \n. En caso de error, lanza una excepción 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

Renombra o mueve un archivo o directorio $origin. Por defecto, sobrescribe los archivos y directorios existentes. Con el parámetro $overwrite establecido en false, lanza una excepción Nette\InvalidStateException si el archivo o directorio de destino $target existe. En caso de error, lanza una excepción Nette\IOException.

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

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

Escribe la cadena $content en el archivo $file. En caso de error, lanza una excepción Nette\IOException.

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

Rutas

isAbsolute (string $path)bool

Determina si la ruta $path es absoluta.

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

joinPaths (string …$segments)string

Une todos los segmentos de la ruta y normaliza el resultado.

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

Normaliza .. y . y los separadores de directorios en la ruta a los del sistema.

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

unixSlashes (string $path)string

Convierte las barras a / utilizadas en los sistemas Unix.

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

platformSlashes (string $path)string

Convierte las barras a los caracteres específicos de la plataforma actual, es decir, \ en Windows y / en otros lugares.

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

resolvePath (string $basePath, string $path)string

Deriva la ruta final de la ruta $path con respecto al directorio base $basePath. Las rutas absolutas (/foo, C:/foo) se dejan sin cambios (solo se normalizan las barras), las rutas relativas se adjuntan a la ruta base.

// En Windows, las barras en la salida serían opuestas (\)
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'

Acceso estático vs no estático

Para que, por ejemplo, para fines de prueba, puedas reemplazar fácilmente la clase por otra (un mock), úsala de forma no estática:

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

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

	...
}
versión: 4.0