permission funciona eliminar ejemplo delete como comando carpeta borra php exception-handling unlink

funciona - unlink php ejemplo



PHP unlink() manejando la excepción (7)

Manejando el error "Resource Unavailable" mediante unlink () como Exception usando try catch

Incluso is_file() o file_exists() comprobarán si el archivo existe o no, hay posibilidades de que el archivo esté siendo utilizado por algunas aplicaciones que impidan la eliminación y unlink() mostrará el error "Resource Unavailable".

Entonces, después de probar muchos métodos como: is_resource() , is_writable() , stream_get_meta_data() ... etc, llegué a la única mejor manera de manejar el error mientras "borraba" un archivo que no existe o existe, pero está siendo utilizado por alguna aplicación

function delete_file($pFilename) { if ( file_exists($pFilename) ) { // Added by [email protected] // ''@'' will stop displaying "Resource Unavailable" error because of file is open some where. // ''unlink($pFilename) !== true'' will check if file is deleted successfully. // Throwing exception so that we can handle error easily instead of displaying to users. if( @unlink($pFilename) !== true ) throw new Exception(''Could not delete file: '' . $pFilename . '' Please close all applications that are using it.''); } return true; }

=== USO ===

try { if( delete_file(''hello_world.xlsx'') === true ) echo ''File Deleted''; } catch (Exception $e) { echo $e->getMessage(); // will print Exception message defined above. }

Bueno, me he estado preguntando si puedo manejar la función unlink() correctamente. No quiero que la función unlink() arroje un error desagradable si no puede desvincular el archivo (puede deberse a que no se encontró el archivo).

Probé algo como

try { unlink("secret/secret.txt"); } catch(Exception $e) { print "whoops!"; //or even leaving it empty so nothing is displayed }

Pero no está funcionando. No soy un experto en PHP. Busqué y encontré este código de manejo de excepciones en algún lugar de la web. Pero como puedo recordar mis días escolares, lo mismo se usó para Java. Por lo que debería haber funcionado. No sé qué está mal con el código.

O simplemente puedo usar una sentencia if..else como

if(unlink($file)){ //leaving here empty must ensure that nothing is displayed }else{ //leaving here empty must ensure that nothing is displayed }

Pero este código tampoco funciona. ¿Dónde estoy cometiendo el error? ¿Cuáles son las otras formas de manejarlo adecuadamente?

¿Se pueden ocultar los errores al manipular el informe de errores (PHP) (entorno de producción y desarrollo)?


Este método puede parecer extraño pero creo que es el más infalible

if(is_file($file) && @unlink($file)){ // delete success } else if (is_file ($file)) { // unlink failed. // you would have got an error if it wasn''t suppressed } else { // file doesn''t exist }

¿Por qué?

En primer lugar, is_file es el método correcto para verificar si existe un ARCHIVO, no un file_exists existe. file_exists comprueba tanto los directorios como los archivos, por lo que puede devolver TRUE para un directorio con el mismo nombre de archivo, no puede eliminar un directorio con unlink y al hacerlo se generará un error.

Comprobar que existe un archivo ( is_file ) antes de unlink es la forma correcta / mejor de eliminar un archivo.

if(is_file($file) && unlink($file)){

Pero no es un método infalible, ya que es común que un archivo se elimine en la pequeña ventana entre la comprobación de is_file y el unlink . He experimentado esto varias veces cuando un método de almacenamiento en caché usa el sistema de archivos.

Pero es el mejor método disponible.

¡Así que puedes hacer todo bien y aún recibir un error!

Bueno, al menos el error te dice si falla ... bueno, en realidad puedes decir si falla sin el error

unlink

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Si lo ha codificado correctamente y puede diferenciar entre un desvío exitoso y un fallido, entonces SÍ suprime el error , no lo beneficia ni a usted ni a su código.

Si se suprime o no el error, este es el mejor método que se me ocurre para evitar que suceda. Al reducir el tiempo entre la verificación y la eliminación, reducirá la probabilidad de que se produzca un error.

EDITAR: URLs de enlace actualizadas


Mi experiencia dice que llamar a file_exists () justo antes de llamar a unlink () NO funciona, incluso si se llamó a clearstatcache () justo antes de llamar a file_exists () .

Hay muchas combinaciones de versiones de PHP y sistemas operativos y la única forma en que he encontrado que siempre funciona (es decir, evita mostrar el mensaje de advertencia en caso de error) es hacer que mi propia función sea silent_unlink () :

function silent_unlink( $filename ) { $old_er = error_reporting(); error_reporting( $old_er & ~E_WARNING ); $result = unlink( $filename ); error_reporting( $old_er ); return $result; }

Desactiva el informe de errores de las advertencias solo para llamar a unlink () y restaura el estado anterior error_reporting () .


Puede usar is_writable para probar si tiene los permisos adecuados para modificar o eliminar un archivo.

http://php.net/manual/en/function.is-writable.php

try { if(!is_writable($file)) throw new Exception(''File not writable''); unlink($file); } catch(Exception $e) { /* do what you want */ }


Si solo quieres suprimir el error, puedes hacer esto:

@unlink(''your_file_name'');

Generalmente, en php, @ suprimirá cualquier error.

La mejor manera es minimizar la probabilidad de error. Usted ha dicho que una de las posibilidades de error es causada por un archivo inexistente. Si yo fuera tú, haré esto:

if(file_exists(''your_file_name'')){ unlink(''your_file_name''); }else{ echo ''file not found''; }

Buena suerte :)



unlink no lanza excepciones, genera errores. La forma correcta de hacer esto es verificar que el archivo existe antes de intentar llamar a unlink . Si simplemente está preocupado por no tener la salida de errores, debe desactivar display_errors lo que siempre debería hacer en un entorno de producción de todos modos. Entonces simplemente se registrarán.

No suprimir los errores con la @ , rara vez es recomendable.

¿Puedes ser más descriptivo sobre @

No estoy seguro de lo que quieres decir exactamente. Pero la documentación está here . En cuanto a por qué no quieres usarlo ... Eso es porque nunca sabes que el código no funciona o es problemático. Incluso si el código aún funciona desde una perspectiva funcional, todavía tiene un problema y ese problema podría hacer que otra cosa no funcione por completo en algún momento. Si nunca tienes el error, probablemente perderás mucho tiempo en la depuración.

Está bien cambiar el nivel de registro o deshabilitar la visualización de errores, pero nunca desea suprimirlos por completo.