¿Cómo eliminar un archivo a través de PHP?

174

¿Cómo elimino un archivo de mi servidor con PHP si el archivo está en otro directorio?

Aquí está mi diseño de página:

  • projects/backend/removeProjectData.php (este archivo elimina todas mis entradas para la base de datos y también debe eliminar el archivo relacionado)
  • public_files/22.pdf (el lugar donde se encuentra el archivo).

Estoy usando la unlinkfunción:

unlink('../../public_files/' . $fileName);

Pero esto siempre me da un error de que el archivo no existe. ¿Algunas ideas?

Conocido
fuente
2
<pre> Usar ruta absoluta </pre>
Pavunkumar
1
si no marca con una ruta real, es probable que obtenga el "." y ".." que no son archivos también, lo que hace que el archivo no exista errores
DrogoNevets
1
¡Pero cuidado, esto podría no eliminar realmente tu archivo si tu archivo tiene múltiples nombres de archivo / enlaces simbólicos! Vea este hilo para más información: stackoverflow.com/q/17548906/1114320
Sliq

Respuestas:

229

Lo siguiente debería ayudar

  • realpath - Devuelve el nombre de ruta absoluto canonicalizado
  • is_writable - Indica si el nombre del archivo se puede escribir
  • unlink - Elimina un archivo

Ejecute su ruta de archivo a través de realpath, luego verifique si la ruta devuelta es editable y, de ser así, desvincule.

Gordon
fuente
77
Me pregunto cómo w3shools está haciendo esto. w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr
3
@ Gordon, lo siento ... utilicé el término incorrecto, lo que hace una gran diferencia ... estoy de acuerdo en que fue idiota ... pero lo que intenté decir es que un ejemplo de codificación sería más útil ... si necesito visitar otros tres enlaces para entender su respuesta ¿es muy útil? ... lo siento de nuevo por la palabra equivocada ... no soy de un país de habla inglesa ... aunque no puede ser una excusa ...
Ritabrata Gautam
13
@RitabrataGautam "si necesito visitar otros tres enlaces para entender su respuesta, ¿es muy útil?" - Sí lo es. Porque después de ir a los enlaces habrás entendido cómo funciona. Si solo le doy los códigos, no lo entenderá, solo copie y pegue. ¿Qué aprendiste entonces? Nada. Además, el código para eso es muy trivial.
Gordon
1
@ Gordon ... estoy de acuerdo ... sus puntos de vista exigen respeto ... se ganó # 185K ... solo dos preguntas rápidas ... 1> si considero que su respuesta es completa, ¿por qué muchos moderadores aquí dicen que también debe proporcionar algún código? ... no solo enlaces (causa muchos votos negativos) ... 2> ¿no sería mejor si pusieras un código? Ahora, quien tiene una tendencia de aprendizaje seguramente visitará esos enlaces y quién no tenga que irá nuevamente a google para obtener un código listo.
Ritabrata Gautam
2
la respuesta me pareció bastante directa: pero el ejemplo de código que quería: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_
102
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}
UbiQue
fuente
11
votó por usar la file_existsfunción. De lo contrario, recibirá un error si el archivo no existe.
Mahdi
17

Verifique sus permisos en primer lugar en el archivo, para asegurarse de que pueda a) verlo desde su script yb) pueda eliminarlo.

También puede usar una ruta calculada a partir del directorio en el que está ejecutando el script, por ejemplo:

unlink(dirname(__FILE__) . "/../../public_files/" . $filename);

(en PHP 5.3, creo que puede usar la __DIR__constante en lugar de dirname()pero todavía no la he usado)

richsage
fuente
Verifiqué los permisos y no pude ver el archivo al principio, pero ahora todo funciona gracias a la ruta real. gracias por el consejo
Ken
7

Puede eliminar el archivo usando

unlink($Your_file_path);

pero si está eliminando un archivo de su ruta http, entonces este desvío no funciona correctamente. Tienes que dar una ruta de archivo correcta.

Ankit Suthar
fuente
4

Solución AIO, maneja todo, no es mi trabajo, pero me acabo de mejorar. ¡Disfrutar!

/**
 * Unlink a file, which handles symlinks.
 * @see https://github.com/luyadev/luya/blob/master/core/helpers/FileHelper.php
 * @param string $filename The file path to the file to delete.
 * @return boolean Whether the file has been removed or not.
 */
function unlinkFile ( $filename ) {
    // try to force symlinks
    if ( is_link ($filename) ) {
        $sym = @readlink ($filename);
        if ( $sym ) {
            return is_writable ($filename) && @unlink ($filename);
        }
    }

    // try to use real path
    if ( realpath ($filename) && realpath ($filename) !== $filename ) {
        return is_writable ($filename) && @unlink (realpath ($filename));
    }

    // default unlink
    return is_writable ($filename) && @unlink ($filename);
}
Junaid Atari
fuente
se ve perfecto, muchas gracias pero actualícelo ya que no puede usarlo unlinkcomo nombre para su función.
Reham Fahmy
Si es una función estática pública en una clase, unlink es un nombre de función válido: 3v4l.org/MgA2l
nadar
Sí, pero en el escenario actual, Standalone es una mejor opción.
Junaid Atari
1

Sé que esta pregunta es un poco vieja, pero es algo simple que me funciona muy bien para eliminar imágenes de mi proyecto en el que estoy trabajando.

unlink(dirname(__FILE__) . "/img/tasks/" . 'image.jpg');

La dirname(__FILE__)sección imprime la ruta base de su proyecto. El /img/tasks/son dos carpetas por debajo de mi ruta de la base. Y finalmente, está mi imagen que quiero eliminar, que puedes convertir en lo que necesites.

Con esto no he tenido ningún problema para acceder a mis archivos en mi servidor y eliminarlos.

abetwothree
fuente