Cómo comprobar si un archivo existe en PHP
Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)
Muchas veces necesitarás mover archivos o almacenar datos dentro de ellos en PHP. En cualquier caso, saber de antemano si un archivo existe o no puede ayudarnos a evitar un comportamiento inesperado.
PHP viene con una variedad de funciones para trabajar con diferentes tipos de consultas relacionadas con archivos. En este tutorial, te proporcionaré una breve descripción general de todas estas funciones para que puedas elegir la que funcione mejor en tu situación.
La importancia de comprobar si un archivo existe
Existen muchos escenarios en los que podría ser importante comprobar si un archivo existe antes de hacer cualquier otra cosa. Digamos que tu sitio web permite a los usuarios cargar archivos de imágenes en tu servidor a los que pueden acceder más tarde. Es razonable suponer que siempre existe la posibilidad de que un nombre de archivo entre en conflicto si muchos usuarios están usando tu servicio para cargar varios archivos con frecuencia.
En tales casos, es importante verificar si ya hay otro archivo en la ubicación donde quieras guardar el archivo subido recientemente de un usuario. Luego tendrás la opción de seguir algunos pasos, como cambiar el nombre del archivo por otro o informar al usuario que su carga sobrescribirá un archivo existente.
Consideremos otra situación en la que tengas que agregar datos a un archivo en PHP. Si el archivo que creaste para escribir todos tus datos es eliminado por alguna razón, las funciones como file_put_contents() simplemente crearán un nuevo archivo con el nombre especificado y almacenarán tus datos dentro del archivo recién creado. Esto puede ser deseable en algunas situaciones, pero no siempre será así. Por lo tanto, tiene sentido verificar de antemano si el archivo existe si ya esperas que esté ahí antes de que comiences a escribir tus datos.
Comprobar si un archivo existe en PHP
Existen tres funciones diferentes que puedes usar para comprobar si un archivo existe en PHP.
La primera función es file_exists(). Esta función acepta un solo parámetro, que es la ruta donde se encuentra tu archivo. Ten en cuenta que devolverá el valor true tanto para archivos como para directorios existentes. Esto puede ser suficiente para tus necesidades, o puede no serlo.
Puedes considerar el uso de la función is_file() si quieres asegurarte de que la ruta que especificaste apunte a un archivo y no a un directorio. De manera similar, puedes usar la función is_dir() para verificar si la ruta que especificaste existe y si apunta a un directorio.
1 |
<?php
|
2 |
|
3 |
$name = "squares.txt"; |
4 |
$directory = "squares.zip"; |
5 |
|
6 |
if(file_exists($name)) { |
7 |
echo 'The file "'.$name.'" exists.'; |
8 |
}
|
9 |
|
10 |
if(is_file($name)) { |
11 |
echo '"'.$name.'" is indeed a file.'; |
12 |
}
|
13 |
|
14 |
if(is_dir($directory)) { |
15 |
echo '"'.$directory.'" turned out to be a directory.'; |
16 |
}
|
17 |
|
18 |
?>
|
1 |
The file "squares.txt" exists. |
2 |
"squares.txt" is indeed a file. |
3 |
"squares.zip" turned out to be a directory. |
En el ejemplo anterior, nombré intencionalmente a uno de los directorios como squares.zip para mostrar que es importante que hagas tus propias comprobaciones, en lugar de suponer que el nombre de archivo proporcionado es, de hecho, un nombre de archivo o un directorio.
Es importante recordar que tanto is_file() como is_dir() devolverán false incluso para las rutas que realmente existan cuando el directorio padre no tenga los permisos adecuados.
Comprueba si un archivo existe y si es legible o si se puede escribir en él
Es posible usar dos funciones más, llamadas is_readable() e is_writable(), para obtener información adicional sobre un archivo, además de comprobar si existe.
Como su nombre sugiere, la función is_readable() verificará dos cosas: la primera, que el archivo o directorio exista realmente, y la segunda, que el archivo sea legible. De manera similar, la función is_writable() también verifica dos cosas, que el archivo o directorio exista y que se pueda escribir en él.
1 |
<?php
|
2 |
|
3 |
$name = "squares.txt"; |
4 |
|
5 |
if(is_readable($name)) { |
6 |
echo 'We can read "'.$name.'".'; |
7 |
}
|
8 |
|
9 |
if(is_writable($name)) { |
10 |
echo 'We can also modify the contents of "'.$name.'".'; |
11 |
}
|
12 |
|
13 |
?>
|
1 |
We can read "squares.txt". |
2 |
We can also modify the contents of "squares.txt". |
Te aconsejo que tengas cuidado al interpretar el valor de retorno de estas dos funciones. Por ejemplo, nuestro primer instinto cuando is_readable() devuelve false es pensar que el archivo que consultamos no es legible. Sin embargo, la función también devuelve false si el archivo no existe. Es importante tener siempre en cuenta este aspecto de estas funciones.
Ten cuidado con los resultados almacenados en caché
El valor de retorno que obtienes de una llamada a todas estas cinco funciones, es decir, file_exists(), is_file(), is_dir(), is_readable() e is_writeable(), se almacena en caché. Esto significa que las llamadas repetidas a una función, digamos is_file(), podrían mostrarte resultados obsoletos.
PHP almacena en caché los resultados de estas funciones para mejorar el rendimiento. Esto asegura que las múltiples llamadas para consultar el mismo archivo funcionen más rápido. Sin embargo, sus valores de retorno permanecerán iguales incluso si el archivo cambia durante el curso de la ejecución del script.
Los resultados solo se almacenan en caché cuando se trata de los archivos que ya existen. Esto significa que la llamada a una función is_file() seguirá devolviendo false para archivos no existentes, pero comenzará a devolver true tan pronto como el archivo sea creado. Por otro lado, la función seguirá devolviendo true en el caso de una archivo que haya existido durante la primera llamada, incluso después de que el archivo haya sido eliminado.
1 |
<?php
|
2 |
|
3 |
$name = "squares.txt"; |
4 |
|
5 |
if(is_file($name)) { |
6 |
echo '"'.$name.'" is indeed a file.'; |
7 |
}
|
8 |
|
9 |
|
10 |
// Manually delete the file while script waits.
|
11 |
sleep(5); |
12 |
|
13 |
if(is_file($name)) { |
14 |
echo '"'.$name.'" is indeed a file.'; |
15 |
}
|
16 |
|
17 |
clearstatcache(); |
18 |
|
19 |
if(is_file($name)) { |
20 |
echo '"'.$name.'" is indeed a file.'; |
21 |
} else { |
22 |
echo 'The file probably no longer exists.'; |
23 |
}
|
24 |
|
25 |
?>
|
Si ejecutas el fragmento de código anterior para un archivo que existe realmente, y luego lo eliminas manualmente mientras el script espera, la llamada a is_file() aún devolverá true. Sin embargo, puedes obtener los resultados correctos simplemente llamando a clearstatcache() antes de consultar nuevamente la existencia del archivo.
1 |
"squares.txt" is indeed a file. |
2 |
"squares.txt" is indeed a file. |
3 |
The file probably no longer exists. |
Otra cosa que debes recordar es que una llamada a unlink() borra automáticamente la caché, por lo que obtienes resultados nuevos para las llamadas a las funciones como is_file() posteriormente.
Pensamientos finales
Comenzamos este tutorial aprendiendo la importancia de verificar la existencia de archivos en PHP. Después de eso, aprendimos sobre las diferentes funciones que puedes usar para comprobar si un archivo existe en PHP. También aprendimos sobre las ventajas y desventajas que pueden tener algunas de estas funciones.
Como mencioné cerca del final, PHP almacenará en caché los resultados de algunas de estas llamadas a funciones para mejorar el rendimiento. Por lo tanto, asegúrate de borrar la caché antes de hacer algo importante con esos archivos.



