2009-11-13 5 views

Antwort

-1

Wie wies darauf hin, in File.delete()

können Sie einen Securitymanager verwenden, die die exeception für Sie wirft.

3

Eine Deletion kann aufgrund einer oder mehreren Gründen fehlschlagen:

  1. Datei nicht existiert (File#exists() verwenden zu testen).
  2. Datei ist gesperrt (weil sie durch eine andere app (oder Ihren eigenen Code!).
  3. Sie sind nicht berechtigt (aber das hätte geworfen eine Security, nicht zurückgegeben falsch!).

geöffnet Also, wenn die Löschung fehlschlägt, machen Sie eine File#exists(), um zu überprüfen, ob es durch 1) oder 2) verursacht wird.

Zusammengefasst:

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

@BalusC, denken Sie daran, dass File.Exists() kann auch eine Security werfen. –

+0

Sie erhalten keine SecurityException, wenn das Löschen aufgrund von Dateisystemberechtigungen fehlschlägt. – Thilo

+0

Sie erhalten SecurityException nur, wenn Ihre JVM restriktiv konfiguriert ist, z. B. wenn Sie ein Applet sind. Eine "normale" Anwendung wäre hier nicht sandboxed. – Thilo

20

Hmm, Beste, was ich tun konnte. Mit Java 7 können Sie stattdessen java.nio.file.Path#delete() verwenden, wodurch Sie eine detaillierte Ursache für den Fehler erhalten, wenn die Datei oder das Verzeichnis nicht gelöscht werden kann.

Beachten Sie, dass file.list() Einträge für Verzeichnisse zurückgeben kann, die gelöscht werden können. Die API-Dokumentation für das Löschen besagt, dass nur leere Verzeichnisse gelöscht werden können, ein Verzeichnis jedoch als leer angesehen wird, wenn die enthaltenen Dateien z. Betriebssystemspezifische Metadatendateien

+0

@Cory, file.exists(), isDirectory() und list() können alle SecurityExcepions auslösen. –

+0

@Bob: Das passiert nur in einer Sandbox. Und das ursprüngliche delete() hätte höchstwahrscheinlich auch eine SecurityException ausgelöst.Aber aus Gründen der Vollständigkeit, nehme ich an, er sollte es fangen (und sandboxed zurückgeben: kein Dateisystemzugriff) – Thilo

+0

@Thilo hinzugefügt, aber ja, ich habe die gestellte Frage angesprochen, nicht jede andere Möglichkeit, wenn Sie Datei-I/O. :) –

21

In Java 6 gibt leider keine Möglichkeit, warum nicht eine Datei, um zu bestimmen, können gelöscht werden:

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

Diese Löschmethode scheint in Java 7 API nicht zu existieren. [link] (http://download.oracle.com/javase/7/docs/api/java/nio/file/Path.html) Edit: gerade gefunden es ist jetzt in der Klasse Dateien. [link] (http://download.oracle.com/javase/7/docs/api/java/nio/file/Files.html) – RishiD

+0

Wird es ausgelöst, wenn _a file_ nicht gelöscht werden kann? Rückgabetyp ist ungültig! Seine Dokumente sind unklar. Hier gefragt: http://stackoverflow.com/questions/19935624/java-nio-file-files-deletepath-path-void-return-type –

6

Beachten Sie, dass es sich um Ihre eigene Anwendung handeln kann, die verhindert, dass eine Datei gelöscht wird!

Wenn Sie zuvor in die Datei geschrieben und den Writer nicht geschlossen haben, sperren Sie die Datei selbst.

+2

Beim Testen unter Windows 7 mit Java 6 hatte ich dieses Problem auch mit einem Reader . Ich habe versucht, die Datei vor dem Schließen des Readers zu löschen und es ist fehlgeschlagen. – Doppelganger

4

Java 7 java.nio.file.Files Klasse kann auch verwendet werden:

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); 
} 
Verwandte Themen