filetype()
La funzione filetype() è una funzione PHP integrata che restituisce il tipo di un file come string.
Cos'è la funzione filetype()?
filetype() è una funzione PHP integrata che indica che tipo di elemento del filesystem rappresenta un percorso — un file normale, una directory, un collegamento simbolico e così via. Accetta un singolo percorso e restituisce il tipo come string in minuscolo, oppure false in caso di errore.
È utile quando si scorre una directory e occorre trattare file e sottodirectory in modo diverso, quando si vuole verificare che un file caricato sia finito nel posto previsto, oppure quando è necessario saltare voci speciali (pipe, file di dispositivo) che non devono essere lette come file ordinari.
Ecco la sintassi:
La sintassi PHP di filetype()
filetype(string $filename): string|falseDove $filename è un percorso relativo o assoluto all'elemento che si desidera ispezionare.
Valori restituiti
filetype() restituisce una delle seguenti string:
| String restituita | Significato |
|---|---|
file | Un file normale |
dir | Una directory |
link | Un collegamento simbolico |
fifo | Una pipe con nome (FIFO) |
socket | Un socket di dominio Unix |
block | Un dispositivo a blocchi speciale (es. un disco) |
char | Un dispositivo a caratteri speciale (es. un terminale) |
unknown | Il tipo non ha potuto essere determinato |
Se il percorso non esiste o non può essere letto, filetype() restituisce false ed emette un E_WARNING. Poiché false risulta uguale alla string vuota in un confronto non stretto, verificare sempre il risultato con === prima di utilizzarlo.
Come si usa la funzione filetype()?
Passare un percorso ed esaminare la string restituita:
Utilizzo di base
<?php
$path = __FILE__; // the path of the currently running script
$type = filetype($path);
echo "The entry '$path' is of type: $type";
// e.g. The entry '/var/www/index.php' is of type: fileL'uso di __FILE__ garantisce che il percorso esista, quindi l'esempio funziona ovunque senza configurazione.
Gestire il ritorno false
Poiché filetype() restituisce false per un percorso mancante o non leggibile, è necessario proteggere la chiamata prima di usare il risultato. Controllare prima con file_exists() evita del tutto l'avviso:
Ricerca sicura
<?php
$path = '/path/that/does/not/exist';
if (!file_exists($path)) {
echo "Path not found.";
} else {
$type = filetype($path);
echo $type === false
? "Could not determine the type."
: "Type: $type";
}
// Path not found.Distinguere file da directory durante un ciclo
Un compito comune è scorrere una directory e agire solo sui file o solo sulle sottodirectory. filetype() rende il ramo esplicito:
Classificare le voci di una directory
<?php
$dir = sys_get_temp_dir(); // a directory that always exists
foreach (scandir($dir) as $entry) {
if ($entry === '.' || $entry === '..') {
continue; // skip the self/parent references
}
$full = $dir . DIRECTORY_SEPARATOR . $entry;
echo $entry . ' => ' . filetype($full) . PHP_EOL;
}Qui scandir() elenca il contenuto della directory e filetype() etichetta ogni voce. Per un attraversamento di livello inferiore è possibile usare readdir() con opendir().
filetype() vs. is_file() e is_dir()
Quando si ha bisogno solo di una risposta sì/no per un tipo specifico, le funzioni predicato dedicate sono più chiare e non richiedono un confronto di string:
Usare filetype() quando è necessario distinguere tra diversi tipi possibili in un unico punto (ad esempio per saltare FIFO e socket), e usare is_file() / is_dir() quando un singolo controllo boolean risulta più leggibile.
Attenzione alla cache delle stat
PHP memorizza nella cache i risultati delle funzioni del filesystem per la durata di una richiesta, quindi se un percorso viene creato, eliminato o sostituito dopo il primo controllo, filetype() potrebbe restituire un valore obsoleto. Chiamare clearstatcache() per forzare una nuova lettura. Si noti inoltre che filetype() segue i collegamenti simbolici come fa stat() — per rilevare il collegamento stesso, usare lstat().
Conclusione
filetype() restituisce il tipo di un elemento del filesystem come string (file, dir, link e così via) e false in caso di errore. Verificare il risultato con ===, controllare il percorso con file_exists() per evitare avvisi, e ricordarsi di clearstatcache() quando si ricontrolla un percorso che è cambiato durante la richiesta. Per controlli semplici su un singolo tipo preferire is_file() e is_dir(); per l'insieme completo delle statistiche di un file in un'unica chiamata, vedere stat().