files
Table of Contents
Namespaces
Functions
- assertDirectory() : void
- Asserts that a directory exists and is accessible, optionally checking readability and writability.
- assertFile() : void
- Asserts that a file exists and meets specified accessibility and MIME type requirements.
- assertWritableDirectory() : void
- Asserts that a directory exists and is readable and writable.
- bunzip2File() : string
- Decompresses a single bzip2 file, streaming it in chunks.
- bzip2File() : string
- Compresses a single file with bzip2, streaming it in chunks.
- clearFile() : bool
- Clears the content of a file while keeping the file itself.
- copyFile() : bool
- Copies a single file to a destination path.
- copyFilteredFiles() : bool
- Recursively copies files and directories from a source to a destination with filtering.
- copyFilteredFilesWithMetadata() : void
- Copies the filtered files of a directory into a destination directory and, optionally, embeds a `.metadata.json` file describing the archive.
- countFileLines() : int
- Counts the number of lines in a file.
- createSymlink() : bool
- Creates a symbolic link pointing to a target.
- deleteDirectory() : bool
- Deletes a directory recursively.
- deleteFile() : bool
- Deletes a file from the filesystem.
- deleteTemporaryDirectory() : bool
- Deletes a directory located in the system temporary folder (recursively).
- fileChecksum() : string
- Computes the checksum (hash) of a file's contents.
- filesAreEqual() : bool
- Tells whether two files have identical contents.
- findFiles() : array<string|int, SplFileInfo>
- Lists files in a directory with advanced filtering, sorting, and recursive options.
- formatFileSize() : string
- Formats a byte count as a human-readable string.
- getBaseFileName() : string
- Returns the base file name without its extension from a given file path.
- getDirectory() : string
- Normalises (and optionally validates) a directory path.
- getDiskUsage() : float
- Returns the number of used bytes on the filesystem hosting a directory.
- getFileContent() : string
- Reads the entire contents of a file into a string.
- getFileExtension() : string|null
- Retrieves the file extension (including multipart extensions) from a given file path.
- getFileLines() : array<string|int, mixed>|null
- Retrieves all lines from a file as an array, optionally transforming each line with a callback.
- getFileLinesGenerator() : Generator
- Reads a file line by line and yields each line as a generator.
- getFileSize() : int
- Returns the size of a file, in bytes.
- getFreeDiskSpace() : float
- Returns the number of free bytes on the filesystem hosting a directory.
- getHomeDirectory() : string
- Returns the current user’s home directory as a **canonical** path.
- getMimeType() : string|null
- Detects the MIME type of a file using the `finfo` extension.
- getOwnershipInfos() : OwnershipInfos
- Retrieves the current ownership information of a given file or directory.
- getRoot() : string
- Extracts the root directory component of a given path.
- getSchemeAndHierarchy() : array{0: ?string, 1: string}
- Split a filename or URI into its scheme (if any) and hierarchical part.
- getTemporaryDirectory() : string
- Builds a path inside the system temporary directory.
- getTimestampedDirectory() : string
- Get a timestamped file path using a formatted date and optional prefix/suffix.
- getTimestampedFile() : string|null
- Get a timestamped file path using a formatted date and optional prefix/suffix.
- getTotalDiskSpace() : float
- Returns the total size, in bytes, of the filesystem hosting a directory.
- gunzipFile() : string
- Decompresses a single gzip file, streaming it in chunks.
- gzipFile() : string
- Compresses a single file with gzip (DEFLATE), streaming it in chunks.
- hasDirectories() : bool
- Checks if a directory contains at least one subdirectory, or only subdirectories if strict mode is enabled.
- hasFiles() : bool
- Checks if a directory contains at least one file, or only files if strict mode is enabled.
- hasMimeType() : bool
- Checks whether a file's MIME type matches one of the given MIME types.
- isLinux() : bool
- Indicates if the OS system is Linux.
- isMac() : bool
- Indicates if the OS system is Mac.
- isOtherOS() : bool
- Indicates if the OS system is not Windows, Mac or Linux.
- isSymlink() : bool
- Tells whether a path is a symbolic link.
- isWindows() : bool
- Indicates if the OS system is Windows.
- makeDirectory() : string|null
- Creates a directory if it does not exist and returns the path of the directory.
- makeFile() : string
- Creates or updates a file with the given content and options.
- makeTemporaryDirectory() : string
- Creates (or returns if already present) a directory inside the system temporary folder.
- makeTimestampedDirectory() : string|null
- Creates a directory named with a formatted timestamp.
- makeTimestampedFile() : string|null
- Generates a timestamped file path if not exist. Using a formatted date and optional prefix/suffix.
- moveFile() : bool
- Moves (or renames) a single file to a destination path.
- readSymlink() : string
- Returns the target a symbolic link points to.
- recursiveFilePaths() : array<string|int, mixed>
- Recursively retrieves all .php files in a folder (and its subfolders).
- renameFile() : bool
- Renames a single file.
- requireAndMergeArrays() : array<string|int, mixed>
- Requires multiple PHP files (each returning an array) and merges the results.
- shouldExcludeFile() : bool
- Checks if a file path should be excluded based on an array of patterns.
- sortFiles() : void
- Sorts an array of SplFileInfo objects.
- touchFile() : string
- Creates a file if it does not exist, or updates its modification and access times.
- validateMimeType() : void
- Validate the MIME type of a file against a list of allowed types.
- writeFileAtomic() : string
- Writes content to a file **atomically**.
Functions
assertDirectory()
Asserts that a directory exists and is accessible, optionally checking readability and writability.
assertDirectory(string|null $path[, bool $isReadable = true ][, bool $isWritable = false ][, int|null $expectedPermissions = null ]) : void
Parameters
- $path : string|null
-
The path of the directory to check.
- $isReadable : bool = true
-
Whether to assert that the directory is readable. Default: true.
- $isWritable : bool = false
-
Whether to assert that the directory is writable. Default: false.
- $expectedPermissions : int|null = null
-
Optional permission mask (e.g., 0755).
Tags
assertFile()
Asserts that a file exists and meets specified accessibility and MIME type requirements.
assertFile(string|null $file[, array<string|int, mixed>|null $expectedMimeTypes = null ][, bool $isReadable = true ][, bool $isWritable = false ]) : void
This function performs a series of checks on a given file:
- Ensures the file path is not null or empty.
- Confirms that the path points to a valid file.
- Optionally checks if the file is readable.
- Optionally checks if the file is writable.
- Optionally validates the file's MIME type against a provided list.
Parameters
- $file : string|null
-
The path of the file to check. Cannot be null or empty.
- $expectedMimeTypes : array<string|int, mixed>|null = null
-
Optional array of allowed MIME types. If provided, the file's MIME type must match one of these.
- $isReadable : bool = true
-
Whether to assert that the file is readable. Default: true.
- $isWritable : bool = false
-
Whether to assert that the file is writable. Default: false.
Tags
assertWritableDirectory()
Asserts that a directory exists and is readable and writable.
assertWritableDirectory(string|null $directory) : void
Parameters
- $directory : string|null
-
The path of the directory to check.
Tags
bunzip2File()
Decompresses a single bzip2 file, streaming it in chunks.
bunzip2File(string $source[, string|null $destination = null ][, bool $overwrite = true ]) : string
Counterpart of bzip2File(), using the bz2 extension — no subprocess,
and the file is never fully loaded into memory.
Parameters
- $source : string
-
Path to the bzip2 file to decompress.
- $destination : string|null = null
-
Output path. Defaults to
$sourcewithout its.bz2suffix, or$source+.outwhen the source has no.bz2suffix. - $overwrite : bool = true
-
Whether to overwrite an existing destination (default:
true).
Tags
Return values
string —The destination path.
bzip2File()
Compresses a single file with bzip2, streaming it in chunks.
bzip2File(string $source[, string|null $destination = null ][, bool $overwrite = true ]) : string
Standalone bzip2 compression outside of tar archives, using the bz2
extension — no subprocess, and the file is never fully loaded into memory.
Unlike gzipFile(), no compression level is exposed: bzopen() does not
accept one in streaming mode.
Parameters
- $source : string
-
Path to the file to compress.
- $destination : string|null = null
-
Output path. Defaults to
$source+.bz2. - $overwrite : bool = true
-
Whether to overwrite an existing destination (default:
true).
Tags
Return values
string —The destination path.
clearFile()
Clears the content of a file while keeping the file itself.
clearFile(string|null $file[, bool $assertable = true ]) : bool
This function empties the given file. Returns true if the file was successfully cleared, false otherwise.
The behavior on failure depends on the $assertable parameter:
- If
$assertableis true (default), a FileException is thrown if the file does not exist or is not writable. - If
$assertableis false, no exception is thrown; the function simply returns false on failure.
Parameters
- $file : string|null
-
The full path to the file to clear.
- $assertable : bool = true
-
Whether to throw exceptions on failure (default: true).
Tags
Return values
bool —True if the file was cleared successfully, false otherwise.
copyFile()
Copies a single file to a destination path.
copyFile(string $source, string $destination[, bool $overwrite = true ][, bool $createDirectory = true ]) : bool
Unlike copyFilteredFiles() (which mirrors a whole directory tree), this helper copies one file with explicit, typed error handling:
- the source is validated with assertFile() (must exist and be readable);
- if
$destinationis an existing directory, the file is copied inside it, keeping the source basename (thecp source dir/convention); - copying a file onto itself is refused (it would truncate the source);
- when
$overwriteisfalse, an existing destination raises a FileException; - the destination's parent directory is created on demand when
$createDirectoryistrue.
Parameters
- $source : string
-
Path to the source file to copy.
- $destination : string
-
Destination file path, or an existing directory to copy into.
- $overwrite : bool = true
-
Whether to overwrite an existing destination file (default:
true). - $createDirectory : bool = true
-
Whether to create the destination directory if missing (default:
true).
Tags
Return values
bool —Returns true on success.
copyFilteredFiles()
Recursively copies files and directories from a source to a destination with filtering.
copyFilteredFiles(string $sourceDir, string $destDir[, array<string|int, string> $excludePatterns = [] ][, callable|null $filterCallback = null ]) : bool
This function iterates through a source directory and copies its contents to a destination directory, preserving the folder structure. It provides two methods for filtering which files and directories get copied:
$excludePatterns: An array of glob/regex patterns. Any file or directory matching a pattern in this array will be skipped. SeeshouldExcludeFile().$filterCallback: An optional user-defined function. This callback receives the full path of each item and must returntruefor the item to be copied.
Destination directories are created as needed.
Parameters
- $sourceDir : string
-
The path to the source directory to copy from.
- $destDir : string
-
The path to the destination directory.
- $excludePatterns : array<string|int, string> = []
-
An array of patterns to exclude from the copy.
- $filterCallback : callable|null = null
-
Optional callback for custom filtering. It receives the file path and should return
trueto include it.
Tags
Return values
bool —Returns true if at least one file or directory was copied, false otherwise.
copyFilteredFilesWithMetadata()
Copies the filtered files of a directory into a destination directory and, optionally, embeds a `.metadata.json` file describing the archive.
copyFilteredFilesWithMetadata(string $sourceDir, string $destDir[, array<string|int, string> $excludePatterns = [] ][, callable|null $filterCallback = null ][, array<string, mixed> $metadata = [] ]) : void
This is the staging step shared by the directory-archiving helpers (tarDirectory() and zipDirectory()): it delegates the copy to copyFilteredFiles(), writes the metadata when provided, and guarantees the destination is non-empty.
Embedding metadata always makes the destination non-empty, even when no source file
matched the filters (the archive then contains only .metadata.json).
Parameters
- $sourceDir : string
-
The source directory to copy from.
- $destDir : string
-
The destination (staging) directory to copy into.
- $excludePatterns : array<string|int, string> = []
-
Glob patterns or file names to exclude.
- $filterCallback : callable|null = null
-
Optional
function (string $filepath): boolreturningtrueto include the item. - $metadata : array<string, mixed> = []
-
Optional metadata embedded as
.metadata.json.
Tags
countFileLines()
Counts the number of lines in a file.
countFileLines(string|null $file) : int
This function efficiently counts lines by reading the file in chunks, making it suitable even for very large files.
Example usage:
use function oihana\files\countFileLines;
$count = countFileLines('/path/to/file.log');
Parameters
- $file : string|null
-
The full path to the file.
Tags
Return values
int —The total number of lines in the file.
createSymlink()
Creates a symbolic link pointing to a target.
createSymlink(string $target, string $link[, bool $overwrite = false ]) : bool
The target is not required to exist — dangling symlinks are valid and
supported (standard POSIX behaviour). When an entry already exists at $link,
it is replaced only if $overwrite is true.
Parameters
- $target : string
-
The path the symlink points to.
- $link : string
-
The symlink path to create.
- $overwrite : bool = false
-
Whether to replace an existing file/symlink at
$link(default:false).
Tags
Return values
bool —Returns true on success.
deleteDirectory()
Deletes a directory recursively.
deleteDirectory(string|array<string|int, mixed>|null $path[, bool $assertable = true ][, bool $isReadable = true ][, bool $isWritable = true ]) : bool
Parameters
- $path : string|array<string|int, mixed>|null
-
Directory or segments to remove.
- $assertable : bool = true
-
Whether to validate the resulting path. Defaults to true.
- $isReadable : bool = true
-
Check if the directory is readable (Default true).
- $isWritable : bool = true
-
Check if the directory is writable (Default false).
Tags
Return values
bool —Returns true if the directory is removed.
deleteFile()
Deletes a file from the filesystem.
deleteFile(string $filePath[, bool $assertable = true ][, bool $isReadable = true ][, bool $isWritable = true ]) : bool
This function optionally asserts that the file exists and meets
the specified readability and writability requirements before attempting deletion.
If the deletion fails, a FileException is thrown.
Parameters
- $filePath : string
-
The path to the file to delete.
- $assertable : bool = true
-
Whether to perform assertions on the file before deletion (default: true).
- $isReadable : bool = true
-
Whether to assert that the file is readable (default: true).
- $isWritable : bool = true
-
Whether to assert that the file is writable (default: true).
Tags
Return values
bool —Returns true on successful deletion.
deleteTemporaryDirectory()
Deletes a directory located in the system temporary folder (recursively).
deleteTemporaryDirectory(string|array<string|int, string>|null $path[, bool $assertable = true ][, bool $isReadable = true ][, bool $isWritable = true ]) : bool
The given $path is appended to sys_get_temp_dir()
in the same way as getTemporaryDirectory():
null→ sys temp dir itself,'logs'→ "/tmp/logs",['my', 'app']→ "/tmp/my/app".
Parameters
- $path : string|array<string|int, string>|null
-
Optional sub‑path(s) inside sys_get_temp_dir().
- $assertable : bool = true
-
Whether to validate the composed directory before deletion. Defaults to true.
- $isReadable : bool = true
-
Check readability (passed to assertDirectory()). Defaults to true.
- $isWritable : bool = true
-
Check writability (passed to assertDirectory()). Defaults to true.
Tags
Return values
bool —True if the directory was deleted or did not exist.
fileChecksum()
Computes the checksum (hash) of a file's contents.
fileChecksum(string $file[, string $algorithm = 'sha256' ]) : string
Reads the file through hash_file(), so the whole file does not need to be
loaded into memory. Useful for integrity checks, deduplication, and verifying
extracted archives.
Parameters
- $file : string
-
Path to the file to hash.
- $algorithm : string = 'sha256'
-
A hashing algorithm supported by hash_algos() (default:
'sha256').
Tags
Return values
string —The computed hash, lowercase hexadecimal.
filesAreEqual()
Tells whether two files have identical contents.
filesAreEqual(string $a, string $b[, string $algorithm = 'sha256' ]) : bool
The comparison is short-circuited for speed:
- if both paths resolve to the same file on disk, returns
truewithout reading; - if the file sizes differ, returns
falsewithout hashing; - otherwise the files are compared by fileChecksum().
Parameters
- $a : string
-
Path to the first file.
- $b : string
-
Path to the second file.
- $algorithm : string = 'sha256'
-
A hashing algorithm supported by hash_algos() (default:
'sha256').
Tags
Return values
bool —true if both files have identical contents, false otherwise.
findFiles()
Lists files in a directory with advanced filtering, sorting, and recursive options.
findFiles(string|null $directory[, array{filter?: callable|null, followLinks?: bool|null, includeDots?: bool|null, mode?: string|null, order?: string|null, pattern?: string|array|null, recursive?: bool|null, sort?: callable|string|array|null} $options = [] ]) : array<string|int, SplFileInfo>
This function provides flexible options for retrieving files and directories from a given path. It supports recursive search, glob and regex pattern matching, sorting, symbolic link following, and custom filters.
Parameters
- $directory : string|null
-
The target directory path. If null or invalid, a DirectoryException is thrown.
- $options : array{filter?: callable|null, followLinks?: bool|null, includeDots?: bool|null, mode?: string|null, order?: string|null, pattern?: string|array|null, recursive?: bool|null, sort?: callable|string|array|null} = []
-
Optional settings to customize the file listing.
- filter : A function to map or transform each SplFileInfo result.
- followLinks : Whether to follow symbolic links (default: false).
- includeDots : Whether to include dot files (default: false).
- mode : Filter by type: 'files', 'dirs', or 'both' (default: 'files').
- order : Sort order: 'asc' (default) or 'desc'.
- pattern : A glob pattern, regex, or list of patterns to match file names.
- recursive : Whether to search recursively (default: false).
- sort : A sort option, eg: callback, predefined string, or array of keys.
Tags
Return values
array<string|int, SplFileInfo>formatFileSize()
Formats a byte count as a human-readable string.
formatFileSize(int $bytes[, int $precision = 2 ]) : string
Uses binary multiples (base 1024) with the FileSizeUnit symbols B, KB, MB, GB, TB, PB.
Byte values are rendered without decimals; larger units use $precision decimals.
Zero or negative values yield "0 B". Values beyond PB are clamped to PB.
Parameters
- $bytes : int
-
The size in bytes (e.g. from getFileSize()).
- $precision : int = 2
-
Number of decimals for non-byte units (default:
2).
Tags
Return values
string —A human-readable size, e.g. "1.18 MB".
getBaseFileName()
Returns the base file name without its extension from a given file path.
getBaseFileName(string $file[, array<string|int, mixed>|null $multiplePartExtensions = null ]) : string
This function extracts the file name from a full path and removes its extension.
It supports both single and multi-part extensions (e.g. .tar.gz, .blade.php).
Parameters
- $file : string
-
The full path to the file (e.g. '/path/to/archive.tar.gz').
- $multiplePartExtensions : array<string|int, mixed>|null = null
-
Optional list of multi-part extensions to consider (e.g. ['.tar.gz', '.blade.php']). If null, the method defaults to FileExtension::getMultiplePartExtensions().
Tags
Return values
string —The file name without its extension (e.g. 'archive' for 'archive.tar.gz').
getDirectory()
Normalises (and optionally validates) a directory path.
getDirectory(string|array<string|int, mixed>|null $path[, bool $assertable = true ][, bool $isReadable = true ][, bool $isWritable = false ]) : string
- If
$pathis an array, empty segments andChar::EMPTYare removed, then the remaining parts are joined withDIRECTORY_SEPARATOR. - If
$assertableis true (default), assertDirectory() ensures the resulting path exists and is readable. - Trailing separators are always stripped before return.
Parameters
- $path : string|array<string|int, mixed>|null
-
Directory or segments to normalise.
Examples:'/tmp'or['tmp','logs']. - $assertable : bool = true
-
Whether to validate the resulting path. Default: true.
- $isReadable : bool = true
-
Whether to assert that the directory is readable. Default: true.
- $isWritable : bool = false
-
Whether to assert that the directory is writable. Default: false.
Tags
Return values
string —Normalized directory path.
getDiskUsage()
Returns the number of used bytes on the filesystem hosting a directory.
getDiskUsage([string $directory = '.' ]) : float
Computed as getTotalDiskSpace() − getFreeDiskSpace(), so the result shares the same unit (bytes) as the two helpers it builds on. Pair it with formatFileSize() for a human-readable value, or divide by getTotalDiskSpace() for a usage ratio.
Parameters
- $directory : string = '.'
-
A directory (or path) on the filesystem to inspect (default:
'.').
Tags
Return values
float —The number of used bytes.
getFileContent()
Reads the entire contents of a file into a string.
getFileContent(string|null $file[, int|null $maxBytes = null ]) : string
Symmetric counterpart of makeFile() (which writes a file): where getFileLines() reads a file line by line, this helper returns the whole content as a single string.
Parameters
- $file : string|null
-
The full path to the file to read.
- $maxBytes : int|null = null
-
Optional cap on the file size (in bytes). When set, the file is rejected before* being read if its size exceeds this value, throwing RuntimeException. Default
null(no limit). Useful as a defensive guard against OOM when the caller does not fully trust the input size.
Tags
Return values
string —The full file contents. An empty string for an empty file.
getFileExtension()
Retrieves the file extension (including multipart extensions) from a given file path.
getFileExtension(string $file[, array<string|int, mixed>|null $multiplePartExtensions = null ][, bool $lowercase = true ]) : string|null
This function extracts the file extension from the filename portion of the path,
supporting both simple extensions (e.g. .txt) and multipart extensions (e.g. .tar.gz, .blade.php).
It relies on the getBaseFileName() function to determine the filename without its extension,
then returns the remainder as the extension.
The function normalizes Windows-style backslashes (\) to forward slashes (/) before processing.
Parameters
- $file : string
-
The full path or filename from which to extract the extension.
- $multiplePartExtensions : array<string|int, mixed>|null = null
-
Optional array of multipart extensions to consider. If null, the default set from
FileExtension::getMultiplePartExtensions()is used. - $lowercase : bool = true
-
Enforce the extension to be lowercase (default true).
Tags
Return values
string|null —The file extension including the leading dot (e.g. .tar.gz),
or null if the file has no extension.
getFileLines()
Retrieves all lines from a file as an array, optionally transforming each line with a callback.
getFileLines(string|null $file[, callable|null $map = null ][, int|null $maxBytes = null ]) : array<string|int, mixed>|null
This function uses a generator internally (getFileLinesGenerator) to read the file line by line,
which allows efficient processing of large files. Each line can optionally be mapped using the
provided callable.
Example usage:
use function oihana\files\getFileLines;
$lines = getFileLines('/path/to/file.log');
// Using a mapping function to parse CSV lines
$csvLines = getFileLines('/path/to/data.csv', fn($line) => str_getcsv($line));
// Refusing files larger than 10 MiB (defensive cap on untrusted sources).
$lines = getFileLines('/path/to/upload.log', null, 10 * 1024 * 1024);
Parameters
- $file : string|null
-
The full path to the file to read.
- $map : callable|null = null
-
Optional mapping function applied to each line. Signature: fn(string $line): mixed
- $maxBytes : int|null = null
-
Optional cap on the file size (in bytes). When set,
getFileLines()rejects any file whose size exceeds this value before opening it, throwing RuntimeException. Defaultnull(no limit — historical behaviour). Useful as a defensive guard against OOM when the caller does not fully trust the size of the input.
Tags
Return values
array<string|int, mixed>|null —Returns an array of lines (or mapped values). Returns an empty array if the file is empty.
getFileLinesGenerator()
Reads a file line by line and yields each line as a generator.
getFileLinesGenerator(string|null $file[, callable|null $map = null ]) : Generator
Each line can optionally be transformed using a callback function. This is particularly useful for processing large files efficiently without loading the entire file into memory at once.
Example usage:
use function oihana\files\getFileLinesGenerator;
// Simply iterate over each line
foreach (getFileLinesGenerator('/path/to/file.log') as $line)
{
echo $line, PHP_EOL;
}
// Using a mapping function to parse CSV lines
foreach (getFileLinesGenerator('/path/to/data.csv', fn($line) => str_getcsv($line)) as $csvRow)
{
print_r($csvRow);
}
Parameters
- $file : string|null
-
Full path to the file to read.
- $map : callable|null = null
-
Optional mapping function applied to each line. Signature: fn(string $line): mixed
Tags
Return values
Generator —Yields each line of the file, optionally transformed by the mapping function.
getFileSize()
Returns the size of a file, in bytes.
getFileSize(string $file) : int
A thin, exception-throwing wrapper around filesize(): the file is first
validated with assertFile() (must exist and be readable), so a missing
file raises a typed FileException rather than a warning + false.
Parameters
- $file : string
-
Path to the file to measure.
Tags
Return values
int —The file size in bytes.
getFreeDiskSpace()
Returns the number of free bytes on the filesystem hosting a directory.
getFreeDiskSpace([string $directory = '.' ]) : float
Typed wrapper around disk_free_space(): an invalid path raises a
FileException instead of returning false. Useful as a pre-flight
guard before extracting an archive or writing large files.
Parameters
- $directory : string = '.'
-
A directory (or path) on the filesystem to inspect (default:
'.').
Tags
Return values
float —The number of available bytes.
getHomeDirectory()
Returns the current user’s home directory as a **canonical** path.
getHomeDirectory() : string
Resolution strategy – in order :
- Unix / macOS / Linux
Uses the
HOMEenvironment variable if it is set and non‑empty. - Windows (≥ XP)
Combines
HOMEDRIVE+HOMEPATH(e.g.C:+\Users\John) if both are available. - Failure
Throws a
RuntimeExceptionwhen no recognised combination is found.
The resulting string is passed through canonicalizePath() so that path separators are normalized (backslashes → slashes) and redundant slashes are removed.
Tags
Return values
string —Canonical absolute path to the user’s home directory.
getMimeType()
Detects the MIME type of a file using the `finfo` extension.
getMimeType(string $file) : string|null
This is the low-level primitive shared by the higher-level MIME helpers
(hasMimeType(), getImageMimeType(), tarFileInfo(),
zipFileInfo()). It returns the raw type reported by
finfo (e.g. text/plain, application/zip) without any normalization.
The function never throws: it returns null when the path is not a file or
when detection fails (including an empty result), so callers can decide how
to react (a boolean check, a fallback label such as 'unknown', etc.).
Parameters
- $file : string
-
Path to the file to inspect.
Tags
Return values
string|null —The detected MIME type, or null if $file is not a file or detection failed.
getOwnershipInfos()
Retrieves the current ownership information of a given file or directory.
getOwnershipInfos(string $path) : OwnershipInfos
Returns an OwnershipInfo object containing both numeric UID/GID and
their corresponding human-readable owner and group names (if resolvable).
Requires the posix extension to resolve usernames and group names;
otherwise, owner and group may be null.
Parameters
- $path : string
-
Absolute or relative path to the file or directory.
Tags
Return values
OwnershipInfos —Object containing UID, GID, and optionally owner and group names.
getRoot()
Extracts the root directory component of a given path.
getRoot(string $path) : string
This function identifies the root portion of a file system path, including handling of protocol schemes. ( e.g., "file://", "s3://" )
UNIX root ("/"), and Windows root ( e.g., "C:/" ).
It returns the canonical root as a string, or an empty string if the path is relative or empty.
Behavior:
"file:///usr/bin"→"file:///""/usr/bin"→"/""C:\\Windows\\System32"→"C:/""relative/path"→""(empty string)
Parameters
- $path : string
-
The input path, optionally with a scheme.
Tags
Return values
string —The root component of the path, or an empty string if no root can be determined.
getSchemeAndHierarchy()
Split a filename or URI into its scheme (if any) and hierarchical part.
getSchemeAndHierarchy(string $filename) : array{0: ?string, 1: string}
Logic
- Detect the first “://” only once – no array allocation if not present.
- Accept schemes that match RFC‑3986
[A‑Za‑z][A‑Za‑z0‑9+\-.]*. - Return
[$scheme, $hierarchy], where$schemeisnullwhen absent.
Parameters
- $filename : string
-
A path or URI such as
file:///tmp/app.logor/etc/hosts.
Tags
Return values
array{0: ?string, 1: string}getTemporaryDirectory()
Builds a path inside the system temporary directory.
getTemporaryDirectory([string|array<string|int, string>|null $path = null ][, bool $assertable = false ][, bool $isReadable = true ][, bool $isWritable = false ]) : string
Parameters
- $path : string|array<string|int, string>|null = null
-
Optional sub‑path(s) to append inside sys_get_temp_dir().
- $assertable : bool = false
-
Whether to validate the final directory path. Defaults to false because the directory may not exist yet.
- $isReadable : bool = true
-
Check if the directory is readable (Default true).
- $isWritable : bool = false
-
Check if the directory is writable (Default false).
Tags
Return values
string —Normalised temporary directory path.
getTimestampedDirectory()
Get a timestamped file path using a formatted date and optional prefix/suffix.
getTimestampedDirectory([string|null $date = null ][, string $basePath = Char::EMPTY ][, string $prefix = Char::EMPTY ][, string $suffix = Char::EMPTY ][, string|null $timezone = 'Europe/Paris' ][, string|null $format = 'Y-m-d\TH:i:s' ][, bool $assertable = true ]) : string
Combines a date/time string (or the current time) with optional *extension, prefix, suffix, and base path to generate a unique file name. The file is not created on disk.
Asserts by default if the file exist, you can disabled the behavior with the boolean assertable argument.
Parameters
- $date : string|null = null
-
Optional date/time string to use. If null or invalid, the current date/time is used ("now").
- $basePath : string = Char::EMPTY
-
Optional base path in which to place the directory. Defaults to the current directory.
- $prefix : string = Char::EMPTY
-
Optional string to prepend to the directory name (e.g., "/hello-2025-12-01T14:00:00"").
- $suffix : string = Char::EMPTY
-
Optional string to append to the directory name (e.g., "/2025-12-01T14:00:00-hello"").
- $timezone : string|null = 'Europe/Paris'
-
Timezone identifier (e.g., 'Europe/Paris'). Defaults to 'Europe/Paris'.
- $format : string|null = 'Y-m-d\TH:i:s'
-
Date format compatible with DateTime::format(). Defaults to 'Y-m-d\TH:i:s'.
- $assertable : bool = true
-
Whether to validate the path with assertDirectory(). Defaults to true.
Tags
Return values
string —The full path of the generated directory.
getTimestampedFile()
Get a timestamped file path using a formatted date and optional prefix/suffix.
getTimestampedFile([string|null $date = null ][, string $basePath = Char::EMPTY ][, string|null $extension = null ][, string $prefix = Char::EMPTY ][, string $suffix = Char::EMPTY ][, string|null $timezone = 'Europe/Paris' ][, string|null $format = 'Y-m-d\TH:i:s' ][, bool $assertable = true ]) : string|null
Combines a date/time string (or the current time) with optional *extension, prefix, suffix, and base path to generate a unique file name. The file is not created on disk.
Asserts by default if the file exist, you can disabled the behavior with the boolean assertable argument.
Parameters
- $date : string|null = null
-
Optional date/time string to use. If null or invalid, the current date/time is used ("now").
- $basePath : string = Char::EMPTY
-
Optional base path in which to place the file. Defaults to the current directory.
- $extension : string|null = null
-
Optional extension to append to the file name (e.g., ".log", ".txt").
- $prefix : string = Char::EMPTY
-
Optional string to prepend to the file name.
- $suffix : string = Char::EMPTY
-
Optional string to append to the file name (e.g., "2025-12-01T14:00:00-hello"").
- $timezone : string|null = 'Europe/Paris'
-
Timezone identifier (e.g., 'Europe/Paris'). Defaults to 'Europe/Paris'.
- $format : string|null = 'Y-m-d\TH:i:s'
-
Date format compatible with DateTime::format(). Defaults to 'Y-m-d\TH:i:s'.
- $assertable : bool = true
-
Whether to validate the path with assertFile(). Defaults to true.
Tags
Return values
string|null —The full path of the generated file, or null on failure.
getTotalDiskSpace()
Returns the total size, in bytes, of the filesystem hosting a directory.
getTotalDiskSpace([string $directory = '.' ]) : float
Typed wrapper around disk_total_space(): an invalid path raises a
FileException instead of returning false.
Parameters
- $directory : string = '.'
-
A directory (or path) on the filesystem to inspect (default:
'.').
Tags
Return values
float —The total number of bytes of the filesystem.
gunzipFile()
Decompresses a single gzip file, streaming it in chunks.
gunzipFile(string $source[, string|null $destination = null ][, bool $overwrite = true ]) : string
Counterpart of gzipFile(), using the zlib extension — no subprocess,
and the file is never fully loaded into memory.
Parameters
- $source : string
-
Path to the gzip file to decompress.
- $destination : string|null = null
-
Output path. Defaults to
$sourcewithout its.gzsuffix, or$source+.outwhen the source has no.gzsuffix. - $overwrite : bool = true
-
Whether to overwrite an existing destination (default:
true).
Tags
Return values
string —The destination path.
gzipFile()
Compresses a single file with gzip (DEFLATE), streaming it in chunks.
gzipFile(string $source[, string|null $destination = null ][, int $level = -1 ][, bool $overwrite = true ]) : string
Standalone gzip compression outside of tar archives, using the zlib
extension — no subprocess, and the file is never fully loaded into memory.
Parameters
- $source : string
-
Path to the file to compress.
- $destination : string|null = null
-
Output path. Defaults to
$source+.gz. - $level : int = -1
-
Compression level
0–9, or-1for zlib's default (default:-1). - $overwrite : bool = true
-
Whether to overwrite an existing destination (default:
true).
Tags
Return values
string —The destination path.
hasDirectories()
Checks if a directory contains at least one subdirectory, or only subdirectories if strict mode is enabled.
hasDirectories(string|null $dir[, bool $strict = false ]) : bool
Parameters
- $dir : string|null
-
The path to the directory to check. Must be a valid readable directory.
- $strict : bool = false
-
If true, the function returns true only if the directory contains only subdirectories (no files or other items). Defaults to false.
Tags
Return values
bool —Returns true if the directory contains at least one subdirectory, or if in strict mode, only subdirectories.
hasFiles()
Checks if a directory contains at least one file, or only files if strict mode is enabled.
hasFiles(string|null $dir[, bool $strict = false ]) : bool
Parameters
- $dir : string|null
-
The path to the directory to check. Must be a valid readable directory.
- $strict : bool = false
-
If true, the function returns true only if the directory contains only files (no directories or other items). Defaults to false.
Tags
Return values
bool —Returns true if the directory contains at least one file, or if in strict mode, only files.
hasMimeType()
Checks whether a file's MIME type matches one of the given MIME types.
hasMimeType(string $filePath, string|array<string|int, string> $mimeTypes) : bool
The file's MIME type is detected with finfo and compared to each entry of
$mimeTypes using a substring match (via str_contains()), so a partial
type such as application/zip matches a detected application/zip; charset=binary.
Parameters
- $filePath : string
-
Path to the file.
- $mimeTypes : string|array<string|int, string>
-
A single MIME type, or a list of MIME types (or fragments) to match against.
Tags
Return values
bool —True if the file exists and its detected MIME type contains one of $mimeTypes.
isLinux()
Indicates if the OS system is Linux.
isLinux() : bool
Tags
Return values
boolisMac()
Indicates if the OS system is Mac.
isMac() : bool
Tags
Return values
boolisOtherOS()
Indicates if the OS system is not Windows, Mac or Linux.
isOtherOS() : bool
Tags
Return values
boolisSymlink()
Tells whether a path is a symbolic link.
isSymlink(string $path) : bool
Thin wrapper around is_link(): returns false (never throws) for a regular
file, a directory, or a non-existent path.
Parameters
- $path : string
-
The path to test.
Tags
Return values
bool —true if $path is a symbolic link, false otherwise.
isWindows()
Indicates if the OS system is Windows.
isWindows() : bool
Tags
Return values
boolmakeDirectory()
Creates a directory if it does not exist and returns the path of the directory.
makeDirectory(null|array<string|int, mixed>|string $pathOrOptions[, int $permissions = 0755 ][, bool $recursive = true ][, string|null $owner = null ][, string|null $group = null ]) : string|null
Parameters
- $pathOrOptions : null|array<string|int, mixed>|string
-
The path of the directory to create.
- $permissions : int = 0755
-
The permissions to set for the directory (default: 0755).
- $recursive : bool = true
-
If true, creates parent directories as needed (default: true).
- $owner : string|null = null
-
User name or ID to set as directory owner (optional).
- $group : string|null = null
-
Group name or ID to set as directory group (optional).
Tags
Return values
string|null —Returns the path of the directory.
makeFile()
Creates or updates a file with the given content and options.
makeFile(array{append?: bool, content?: string|null, file?: string|null, force?: bool, group?: null|string, lock?: bool, overwrite?: bool, permissions?: int, owner?: string|null}|string|null $fileOrOptions[, string|null $content = null ][, array{append?: bool, force?: bool, group?: null|string, lock?: bool, overwrite?: bool, permissions?: int, owner?: string|null} $options = [] ]) : string
This function writes content to the specified file path. It supports appending to existing files, overwriting, setting file permissions, changing ownership, and group. It can also create the parent directories if needed.
Usage:
- Classic signature:
makeFile(string $filePath, string $content = '', array $options = []);
- Signature with options array as first parameter:
makeFile(array $options);
Required keys in $options:
- 'filePath' (string): The path of the file to create or modify (mandatory).
- 'content' (string): The content to write into the file (optional, default ''). Other keys correspond to options (see below).
Parameters
- $fileOrOptions : array{append?: bool, content?: string|null, file?: string|null, force?: bool, group?: null|string, lock?: bool, overwrite?: bool, permissions?: int, owner?: string|null}|string|null
-
Either the file path as a string (classic usage), or an associative array containing at least 'filePath' and optionally 'content' and other options.
- $content : string|null = null
-
The content to write into the file. Defaults to empty string. Ignored if $filePathOrOptions is array.
- $options : array{append?: bool, force?: bool, group?: null|string, lock?: bool, overwrite?: bool, permissions?: int, owner?: string|null} = []
-
An associative array of options:
- 'append' (bool): If true, appends content instead of overwriting. Default: false.
- 'force' (bool): If true, creates parent directories if they do not exist. Default: true.
- 'group' (string|null): Group name or ID to set as file group owner. Default: null.
- 'lock' (bool): If true, uses an exclusive lock while writing. Default: true.
- 'overwrite' (bool): If true, overwrites existing files. Default: false.
- 'permissions' (int): File permissions to set (octal). Default: 0644.
- 'owner' (string|null): User name or ID to set as file owner. Default: null.
Tags
Return values
string —The path of the created or updated file.
makeTemporaryDirectory()
Creates (or returns if already present) a directory inside the system temporary folder.
makeTemporaryDirectory(string|array<string|int, string>|null $path[, int $permission = 0755 ]) : string
The sub‑path is appended to sys_get_temp_dir() de la même manière que
getTemporaryDirectory() :
null→ the temp dir itself'cache'→/tmp/cache['my', 'app']→/tmp/my/app
Parameters
- $path : string|array<string|int, string>|null
-
Optional sub‑directory path segments.
- $permission : int = 0755
-
Octal mode for
mkdir()(default:0755).
Tags
Return values
string —Full path to the (existing or newly created) temporary directory.
makeTimestampedDirectory()
Creates a directory named with a formatted timestamp.
makeTimestampedDirectory([string|null $date = null ][, string $basePath = Char::EMPTY ][, string $prefix = Char::EMPTY ][, string $suffix = Char::EMPTY ][, string|null $timezone = 'Europe/Paris' ][, string|null $format = 'Y-m-d\TH:i:s' ]) : string|null
Combines a date/time string (or the current time) with optional prefix, suffix, and base path to generate a unique directory name. The directory is created if it does not already exist.
Parameters
- $date : string|null = null
-
Optional date/time string to use. If null or invalid, the current date/time is used ("now").
- $basePath : string = Char::EMPTY
-
Optional base path in which to create the directory. Defaults to an empty string.
- $prefix : string = Char::EMPTY
-
Optional string to prepend to the directory name.
- $suffix : string = Char::EMPTY
-
Optional string to append to the directory name.
- $timezone : string|null = 'Europe/Paris'
-
Timezone identifier (e.g., 'Europe/Paris'). Defaults to 'Europe/Paris'.
- $format : string|null = 'Y-m-d\TH:i:s'
-
Date format compatible with DateTime::format(). Defaults to 'Y-m-d\TH:i:s'.
Tags
Return values
string|null —The full path of the created directory, or null on failure.
makeTimestampedFile()
Generates a timestamped file path if not exist. Using a formatted date and optional prefix/suffix.
makeTimestampedFile([string|null $date = null ][, string $basePath = Char::EMPTY ][, string|null $extension = null ][, string $prefix = Char::EMPTY ][, string $suffix = Char::EMPTY ][, string|null $timezone = 'Europe/Paris' ][, string|null $format = 'Y-m-d\TH:i:s' ][, bool $mustExist = false ]) : string|null
Combines a date/time string (or the current time) with optional prefix, suffix, and base path to generate a unique file name. The file is not created on disk.
Parameters
- $date : string|null = null
-
Optional date/time string to use. If null or invalid, the current date/time is used ("now").
- $basePath : string = Char::EMPTY
-
Optional base path in which to place the file. Defaults to the current directory.
- $extension : string|null = null
-
Optional extension to append to the file name (e.g., ".log", ".txt").
- $prefix : string = Char::EMPTY
-
Optional string to prepend to the file name.
- $suffix : string = Char::EMPTY
-
Optional string to append to the file name (e.g., "2025-12-01T14:00:00-hello"").
- $timezone : string|null = 'Europe/Paris'
-
Timezone identifier (e.g., 'Europe/Paris'). Defaults to 'Europe/Paris'.
- $format : string|null = 'Y-m-d\TH:i:s'
-
Date format compatible with DateTime::format(). Defaults to 'Y-m-d\TH:i:s'.
- $mustExist : bool = false
-
Whether the generated file must exist. If true, asserts the file exists. Defaults to false.
Tags
Return values
string|null —The full path of the generated file, or null on failure.
moveFile()
Moves (or renames) a single file to a destination path.
moveFile(string $source, string $destination[, bool $overwrite = true ][, bool $createDirectory = true ]) : bool
Shares the destination semantics of copyFile():
- the source is validated with assertFile() (must exist and be readable);
- if
$destinationis an existing directory, the file is moved inside it, keeping the source basename; - when
$overwriteisfalse, an existing destination raises a FileException; - the destination's parent directory is created on demand when
$createDirectoryistrue.
The move is performed with rename() (atomic on the same filesystem). When the
source and destination live on different filesystems, rename() cannot span
devices, so the function transparently falls back to copyFile() + deleteFile().
Parameters
- $source : string
-
Path to the source file to move.
- $destination : string
-
Destination file path, or an existing directory to move into.
- $overwrite : bool = true
-
Whether to overwrite an existing destination file (default:
true). - $createDirectory : bool = true
-
Whether to create the destination directory if missing (default:
true).
Tags
Return values
bool —Returns true on success.
readSymlink()
Returns the target a symbolic link points to.
readSymlink(string $link) : string
Parameters
- $link : string
-
Path to the symbolic link.
Tags
Return values
string —The target path the symlink points to.
recursiveFilePaths()
Recursively retrieves all .php files in a folder (and its subfolders).
recursiveFilePaths(string $directory[, array{excludes?: array|null, extensions?: array|null, maxDepth?: int, sortable?: bool} $options = [] ]) : array<string|int, mixed>
Parameters
- $directory : string
-
The base path of the file to be scanned.
- $options : array{excludes?: array|null, extensions?: array|null, maxDepth?: int, sortable?: bool} = []
-
The optional parameter to send in the function.
- excludes (array) : The enumeration of all files to excludes
- extensions (array) : The optional list of the extensions to use to scan the folder(s).
- maxDepth (int) : The maximum allowed depth. Default -1 is used
- sortable (bool) : Indicates if the list of file paths is sorted before returned.
Tags
Return values
array<string|int, mixed> —The list of the full paths to all files found.
renameFile()
Renames a single file.
renameFile(string $source, string $destination[, bool $overwrite = true ][, bool $createDirectory = true ]) : bool
Semantic alias of moveFile(): renaming a file is the same operation as moving it (the destination may be a new name in the same directory, a path in another directory, or an existing directory to move into). See moveFile() for the full destination, overwrite and cross-filesystem semantics.
Parameters
- $source : string
-
Path to the source file to rename.
- $destination : string
-
New file path, or an existing directory to move into.
- $overwrite : bool = true
-
Whether to overwrite an existing destination file (default:
true). - $createDirectory : bool = true
-
Whether to create the destination directory if missing (default:
true).
Tags
Return values
bool —Returns true on success.
requireAndMergeArrays()
Requires multiple PHP files (each returning an array) and merges the results.
requireAndMergeArrays(array<string|int, mixed> $filePaths[, bool $recursive = true ][, string|null $allowedBase = null ][, int|null $maxBytes = null ]) : array<string|int, mixed>
Each path goes through a defensive validation pipeline before require:
- The path must be a non-empty string.
- It must resolve via realpath() to an existing regular file.
- The file extension must be
.php(case-insensitive). - If
$allowedBaseis provided, the resolved file must be located inside that base directory (defense in depth against path-escape attacks). - If
$maxBytesis provided, the file size must be ≤$maxBytes(defensive cap against parser OOM on extremely large config files).
This protects against arbitrary file inclusion when paths come from untrusted
or semi-trusted sources. Note that even with $allowedBase, callers must still
trust the content of the included files — require executes their PHP code.
Parameters
- $filePaths : array<string|int, mixed>
-
An array of file paths to load.
- $recursive : bool = true
-
Whether to perform a deep (recursive) merge (true) or a simple merge (false).
- $allowedBase : string|null = null
-
Optional absolute directory path. When provided, every file in
$filePathsmust be located inside this directory after canonicalisation. Strongly recommended when paths are not 100% trusted at the call site. - $maxBytes : int|null = null
-
Optional per-file size cap (in bytes). When provided, any file whose size exceeds this limit is rejected before being included, throwing RuntimeException. Default
null(no limit — historical behaviour).
Tags
Return values
array<string|int, mixed> —The merged array.
shouldExcludeFile()
Checks if a file path should be excluded based on an array of patterns.
shouldExcludeFile(string $filePath, array<string|int, string> $excludePatterns) : bool
This function supports two types of patterns:
- Glob patterns (e.g., '.log', 'config/.php'). These are matched using fnmatch().
- PCRE regular expressions (e.g., '/^temp-\d+.tmp$/i'). The function auto-detects regex patterns by checking if they are enclosed in matching delimiter characters.
For each pattern, the function attempts to match it against both the full file path and the basename of the file. The match is successful if any pattern matches. The glob matching is performed with the FNM_PATHNAME flag, meaning wildcards will not match directory separators (/).
Parameters
- $filePath : string
-
The absolute or relative path to the file to check.
- $excludePatterns : array<string|int, string>
-
An array of glob or PCRE patterns.
Tags
Return values
bool —Returns true if the file path matches any of the exclusion patterns, false otherwise.
sortFiles()
Sorts an array of SplFileInfo objects.
sortFiles(array<string|int, SplFileInfo> &$files, callable|string|array<string|int, mixed> $sort[, string|null $order = 'asc' ]) : void
Parameters
- $files : array<string|int, SplFileInfo>
-
Array of files to sort (modified in‑place).
- $sort : callable|string|array<string|int, mixed>
-
One of:
- callable : custom compare function, ex:
fn(SplFileInfo $a, SplFileInfo $b): int - string : single built‑in key
'name' | 'ci_name' | 'extension' | 'size' | 'type' | 'atime' | 'ctime' | 'mtime' - array : ordered list of such keys for multi‑criteria sorting e.g. ['type', 'name'] or ['extension','size']
- callable : custom compare function, ex:
- $order : string|null = 'asc'
-
The direction of the sort method 'asc' (default) or 'desc'.
Tags
touchFile()
Creates a file if it does not exist, or updates its modification and access times.
touchFile(string $file[, int|null $mtime = null ][, int|null $atime = null ][, bool $createDirectory = true ]) : string
Thin, exception-throwing wrapper around touch(). When $mtime is null, the
current time is used. When $mtime is given but $atime is null, the access
time is set to $mtime as well. The parent directory is created on demand.
Parameters
- $file : string
-
Path to the file to touch.
- $mtime : int|null = null
-
Modification timestamp (default:
null→ current time). - $atime : int|null = null
-
Access timestamp (default:
null→ same as$mtime). - $createDirectory : bool = true
-
Whether to create the parent directory if missing (default:
true).
Tags
Return values
string —The file path.
validateMimeType()
Validate the MIME type of a file against a list of allowed types.
validateMimeType(string $file, array<string|int, mixed> $allowedMimeTypes) : void
Parameters
- $file : string
-
Path to the file to validate.
- $allowedMimeTypes : array<string|int, mixed>
-
List of allowed MIME types. Can include strings or arrays of strings.
Tags
writeFileAtomic()
Writes content to a file **atomically**.
writeFileAtomic(string $file, string $content[, int $permissions = 0644 ]) : string
The content is first written to a temporary file located in the same
directory as the target (so the final rename() stays on the same
filesystem and is therefore atomic), then renamed over the destination. A
concurrent reader always sees either the previous file or the fully-written
new one — never a half-written file. This addresses the non-atomicity caveat
of plain copy/write helpers (see the copying guide).
The destination's parent directory is created on demand. On failure, the temporary file is removed and a typed exception is thrown.
Parameters
- $file : string
-
Destination file path.
- $content : string
-
The content to write.
- $permissions : int = 0644
-
File permissions to set (octal, default:
0644).
Tags
Return values
string —The destination file path.