file_exists()
La funzione file_exists() di PHP verifica se un file o una directory esiste nel filesystem, restituendo TRUE o FALSE.
Cos'è la funzione file_exists()?
La funzione file_exists() è una funzione built-in di PHP che verifica se un dato percorso punta a un file o a una directory nel filesystem. È uno dei modi più comuni per proteggere le operazioni sui file — la si chiama prima di leggere, scrivere o eliminare, in modo che lo script non vada in crash per un percorso mancante.
Restituisce:
truese il percorso esiste (che si tratti di un file normale, una directory, un symlink o qualsiasi altro file speciale), oppurefalsese il percorso non esiste, oppure se non si hanno i permessi per leggere le informazioni su di esso.
Sintassi
file_exists(string $filename): bool$filename è il percorso da verificare. Può essere:
- un percorso relativo (
'data/users.csv'), risolto rispetto alla directory di lavoro corrente, oppure - un percorso assoluto (
'/var/www/uploads/logo.png'o'C:\\temp\\file.txt'su Windows).
Un Esempio di Base
Se myfile.txt è presente nella directory di lavoro dello script, viene eseguito il primo ramo; altrimenti viene eseguito il ramo else. Poiché file_exists() restituisce un semplice boolean, è possibile usarla direttamente in qualsiasi espressione if, && o ternaria.
Attenzione alla Cache delle Stat
PHP memorizza nella cache il risultato dei controlli sul filesystem (incluso file_exists()) per evitare accessi ripetuti al disco. All'interno di una singola esecuzione dello script, se si verifica un percorso, poi lo si crea o elimina, e poi lo si verifica di nuovo, si potrebbe ancora ottenere la risposta precedente.
Chiamare clearstatcache() per forzare un nuovo controllo:
<?php
$path = 'temp.txt';
file_put_contents($path, 'hello'); // create the file
clearstatcache(); // forget the cached result
var_dump(file_exists($path)); // bool(true)
unlink($path); // delete the file
clearstatcache();
var_dump(file_exists($path)); // bool(false)Questa memorizzazione nella cache è importante negli script a lunga esecuzione e nei cicli che creano o rimuovono file al volo.
file_exists() vs. is_file() vs. is_dir()
file_exists() non può indicare che tipo di elemento esiste — solo che qualcosa esiste. Quando è necessario saperlo con precisione, conviene usare una funzione più specifica:
| Funzione | Restituisce true quando il percorso è… |
|---|---|
file_exists() | un file o una directory (qualsiasi cosa) |
is_file() | un file normale |
is_dir() | una directory |
is_readable() | esiste ed è leggibile dal processo corrente |
is_writable() | esiste ed è scrivibile dal processo corrente |
Un errore comune è usare file_exists() per confermare che un percorso sia un file prima di aprirlo. Se una directory condivide quel nome, file_exists() restituisce true ma fopen() fallirà. In quel caso è preferibile usare is_file().
Casi d'Uso Comuni
Proteggere una lettura in modo che non generi mai un avviso:
<?php
$config = 'config.php';
if (is_file($config)) {
require $config;
} else {
die('Configuration file is missing.');
}Evitare di sovrascrivere un upload esistente aggiungendo un suffisso numerico:
<?php
$target = 'upload.png';
$i = 1;
while (file_exists($target)) {
$target = "upload-$i.png";
$i++;
}
echo "Saving to: $target";Eliminare un file solo se esiste, in modo che unlink() non avvisi per un percorso mancante:
<?php
$tmp = 'cache.tmp';
if (file_exists($tmp)) {
unlink($tmp);
}Cose da Tenere a Mente
- Race condition. Un file può essere creato o rimosso da un altro processo tra il controllo
file_exists()e l'operazione che segue. Per scritture critiche, è spesso più sicuro tentare l'operazione e gestire l'errore piuttosto che controllare prima. - Permessi. Se la directory che porta al file non è accessibile al processo PHP,
file_exists()restituiscefalseanche quando il file è fisicamente presente. - URL remote. Con la giusta configurazione
file_exists()può funzionare su alcuni stream wrapper, ma non verifica in modo affidabile gli URLhttp://— usare invece una funzione comefile_get_contents()con la gestione degli errori.
Per approfondire la lettura e la scrittura dei file, vedere il capitolo Gestione dei File PHP.