file_exists()
La fonction file_exists() en PHP vérifie si un fichier ou un répertoire existe et retourne TRUE ou FALSE selon le résultat.
Qu'est-ce que la fonction file_exists() ?
La fonction file_exists() est une fonction PHP intégrée qui indique si un chemin donné pointe vers un fichier ou un répertoire dans le système de fichiers. C'est l'un des moyens les plus courants de protéger les opérations sur les fichiers — vous l'appelez avant de lire, d'écrire ou de supprimer, afin que votre script ne plante pas sur un chemin inexistant.
Elle retourne :
truesi le chemin existe (qu'il s'agisse d'un fichier ordinaire, d'un répertoire, d'un lien symbolique ou de tout autre fichier spécial), oufalsesi rien n'existe à ce chemin, ou si vous n'avez pas la permission de lire les informations le concernant.
Syntaxe
file_exists(string $filename): bool$filename est le chemin à vérifier. Il peut être :
- un chemin relatif (
'data/users.csv'), résolu par rapport au répertoire de travail courant, ou - un chemin absolu (
'/var/www/uploads/logo.png'ou'C:\\temp\\file.txt'sous Windows).
Un exemple de base
Si myfile.txt est présent dans le répertoire de travail du script, la première branche s'exécute ; sinon, la branche else s'exécute. Comme file_exists() retourne un simple boolean, vous pouvez l'utiliser directement dans toute expression if, && ou ternaire.
Attention au cache des statistiques
PHP met en cache le résultat des vérifications du système de fichiers (y compris file_exists()) pour éviter d'accéder trop souvent au disque. Dans une même exécution de script, si vous vérifiez un chemin, puis le créez ou le supprimez, puis le vérifiez à nouveau, vous obtiendrez peut-être encore l'ancienne réponse.
Appelez clearstatcache() pour forcer une actualisation :
<?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)Ce mécanisme de cache est important dans les scripts à longue durée d'exécution et les boucles qui créent ou suppriment des fichiers à la volée.
file_exists() vs. is_file() vs. is_dir()
file_exists() ne peut pas vous dire quel type d'élément existe — seulement que quelque chose existe. Lorsque vous avez besoin de précision, utilisez une fonction plus spécifique :
| Fonction | Retourne true quand le chemin est… |
|---|---|
file_exists() | un fichier ou un répertoire (n'importe quoi) |
is_file() | un fichier ordinaire |
is_dir() | un répertoire |
is_readable() | existe et est lisible par le processus en cours |
is_writable() | existe et est accessible en écriture par le processus en cours |
Une erreur courante consiste à utiliser file_exists() pour confirmer qu'un chemin est un fichier avant de l'ouvrir. Si un répertoire porte le même nom, file_exists() retourne true mais fopen() échouera ensuite. Préférez is_file() dans ce cas.
Cas d'utilisation courants
Protéger une lecture pour ne jamais déclencher d'avertissement :
<?php
$config = 'config.php';
if (is_file($config)) {
require $config;
} else {
die('Configuration file is missing.');
}Éviter d'écraser un fichier uploadé existant en ajoutant un suffixe numérique :
<?php
$target = 'upload.png';
$i = 1;
while (file_exists($target)) {
$target = "upload-$i.png";
$i++;
}
echo "Saving to: $target";Supprimer un fichier uniquement s'il existe, pour que unlink() n'avertisse pas d'un chemin manquant :
<?php
$tmp = 'cache.tmp';
if (file_exists($tmp)) {
unlink($tmp);
}Points importants à retenir
- Conditions de concurrence. Un fichier peut être créé ou supprimé par un autre processus entre votre vérification
file_exists()et l'opération qui suit. Pour les écritures critiques, il est souvent plus sûr de tenter l'opération et de gérer l'erreur plutôt que de vérifier en premier. - Permissions. Si le répertoire menant au fichier n'est pas accessible au processus PHP,
file_exists()retournefalsemême si le fichier est physiquement présent. - URL distantes. Avec la bonne configuration,
file_exists()peut fonctionner avec certains gestionnaires de flux, mais elle ne vérifie pas de manière fiable les URLhttp://— utilisez plutôt une fonction commefile_get_contents()avec une gestion des erreurs.
Pour aller plus loin sur la lecture et l'écriture de fichiers, consultez le chapitre Gestion des fichiers PHP.