W3docs

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:

  • true se il percorso esiste (che si tratti di un file normale, una directory, un symlink o qualsiasi altro file speciale), oppure
  • false se 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

php— editable, runs on the server

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:

FunzioneRestituisce 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() restituisce false anche 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 URL http:// — usare invece una funzione come file_get_contents() con la gestione degli errori.

Per approfondire la lettura e la scrittura dei file, vedere il capitolo Gestione dei File PHP.

Pratica

Pratica
Qual è la funzione di 'file_exists()' in PHP?
Qual è la funzione di 'file_exists()' in PHP?
Was this page helpful?