2009-11-13 9 views

Respuesta

-1

Como se señaló en File.delete()

puede utilizar un SecurityManager que lanza el exeception para usted.

3

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

  1. archivo no existe (utilizar File#exists() para probar).
  2. El archivo está bloqueado (ya que es abierto por otra aplicación (o en su propio código!).
  3. No está autorizado (pero que habría arrojado una SecurityException, no se devuelve falso!).

Por lo tanto, siempre que la eliminación falle, realice un File#exists() para verificar si es causado por 1) o 2).

resumirse así:

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 + "."); 
} 
+0

@BalusC, recuerde que File.Exists() también puede lanzar una SecurityException. –

+0

No obtendrá una SecurityException si la eliminación falla debido a los permisos del sistema de archivos. – Thilo

+0

Solo obtendrá SecurityException si su JVM está configurada de forma restrictiva, por ejemplo, si usted es un applet. Una aplicación "normal" no se incluiría en la zona de pruebas aquí. – Thilo

20

Hmm, mejor que podía 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."; 
    } 
} 
+0

@Cory, file.exists(), isDirectory() y list() pueden arrojar SecurityExcepions. –

+0

@Bob: Eso solo sucede en un sandbox. Y la eliminación original() probablemente también arrojaría una SecurityException.Pero para compleción, supongo que debería atraparlo (y devolver "sandboxed: no hay acceso al sistema de archivos") – Thilo

+0

@Thilo agregado, pero sí, estaba respondiendo a la pregunta, no a todas las otras posibilidades cuando participo en el archivo de E/S. :) –

21

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(), 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 API para eliminar dice que solo se pueden eliminar directorios vacíos, pero un directorio se considera vacío, si los archivos contenidos son, p. Archivos de metadatos específicos del sistema operativo.

+7

Este método de eliminación no parece existir en la API de Java 7. [link] (http://download.oracle.com/javase/7/docs/api/java/nio/file/Path.html) Editar: lo encontré ahora en la clase de archivos. [link] (http://download.oracle.com/javase/7/docs/api/java/nio/file/Files.html) – RishiD

+0

¿Se lanza cuando _a file_ no se borra? El tipo de devolución es nulo! Sus documentos no están claros. Preguntado aquí: http://stackoverflow.com/questions/19935624/java-nio-file-files-deletepath-path-void-return-type –

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.

+2

Al probar en Windows 7 usando Java 6 tuve este problema con un lector también . Intenté eliminar el archivo antes de cerrar el lector y falló. – Doppelganger

4

Java 7 java.nio.file.Files clase puede ser también usada:

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); 
} 
Cuestiones relacionadas