studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java file-io error-handling jdk1.6 jdk6

programacion - ¿Cómo saber por qué una eliminación de archivos falla en Java?



manual de programacion android pdf (6)

¡Tenga en cuenta que puede ser su propia aplicación la que evita que se elimine un archivo!

Si escribió el archivo anteriormente y no cerró el escritor, está bloqueando el archivo usted mismo.

File file = new File(path); if (!file.delete()) { throw new IOException( "Failed to delete the file because: " + getReasonForFileDeletionFailureInPlainEnglish(file)); }

¿Hay una buena implementación de getReasonForFileDeletionFailureInPlainEnglish(file) ya disponible? O bien, tendré que escribirlo yo mismo.


Como se señala en File.delete()

puede usar un SecurityManager que arroje la excepción por usted.


En Java 6, desafortunadamente no hay forma de determinar por qué un archivo no se puede eliminar. Con Java 7, puede usar java.nio.file.Path#delete() lugar, lo que le dará una causa detallada de la falla, si el archivo o directorio no se puede eliminar.

Tenga en cuenta que file.list () puede devolver entradas para directorios, que se pueden eliminar. La documentación de la API para eliminar dice que solo los directorios vacíos se pueden eliminar, pero un directorio se considera vacío, si los archivos contenidos son, por ejemplo, archivos de metadatos específicos del sistema operativo.


Hmm, lo mejor que puedo hacer:

public String getReasonForFileDeletionFailureInPlainEnglish(File file) { try { if (!file.exists()) return "It doesn''t exist in the first place."; else if (file.isDirectory() && file.list().length > 0) return "It''s a directory and it''s not empty."; else return "Somebody else has it open, we don''t have write permissions, or somebody stole my disk."; } catch (SecurityException e) { return "We''re sandboxed and don''t have filesystem access."; } }


Java 7 java.nio.file.Files class también se puede utilizar:

http://docs.oracle.com/javase/tutorial/essential/io/delete.html

try { Files.delete(path); } catch (NoSuchFileException x) { System.err.format("%s: no such" + " file or directory%n", path); } catch (DirectoryNotEmptyException x) { System.err.format("%s not empty%n", path); } catch (IOException x) { // File permission problems are caught here. System.err.println(x); }


Una eliminación puede fallar debido a una o más razones:

  1. El archivo no existe (use File#exists() para probar).
  2. El archivo está bloqueado (porque lo abre otra aplicación (¡o tu propio código!).
  3. Usted no está autorizado (pero eso hubiera arrojado una SecurityException, ¡no devuelta falsa!).

Por lo tanto, cada vez que falla la eliminación, File#exists() un File#exists() para verificar si está causado por 1) o 2).

Resumido:

if (!file.delete()) { String message = file.exists() ? "is in use by another app" : "does not exist"; throw new IOException("Cannot delete file, because file " + message + "."); }