2016-11-20 4 views
6

Ich habe versucht, eine Datei im Windows-Betriebssystem mit dem Java IO file.delete() API zu löschen. Es schlägt jedoch fehl und gibt false zurück. Der gleiche Code funktioniert wie ein Zauber in Ubuntu.Fehler beim Löschen einer Datei in Windows mit Java

Ich habe überprüft, dass die Berechtigungen der Datei es dem Programm ermöglicht, es zu löschen. Außerdem wurde der gesamte Eingabe- und Ausgabestream für die Datei als Versuch mit Ressourcen geöffnet.

try (InputStream in = new FileInputStream(localFile); OutputStream out = new FileOutputStream(destinationFileName))

Mit einem Debugger habe ich getestet und herausgefunden, dass bei der Code-Zeile, die ich die Datei löschen true Anrufe für folgende API gibt.

file.exists() 
file.canRead(); 
file.canWrite(); 
file.canExecute(); 

Ich habe versucht, auch System.gc() Recht hinzufügen, bevor werden, dass alle Ströme machen Aufruf löschen geschlossen.

Nicht sicher, ob dies hilfreiche Informationen ist, aber ich habe sogar versucht, die Apache Commons FileUtils.forceDelete(file) Methode und es wurde auch fehlgeschlagen.

Also was fehlt mir hier?

Update:

von Files.delete(Paths.get(file.getAbsolutePath())) mit bekam ich folgende Fehlermeldung.

java.nio.file.FileSystemException: C:\Users\thuvvareka\Desktop\temp\in\sd.xml: The process cannot access the file because it is being used by another process. 
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) 
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) 
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) 
    at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269) 
    at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103) 
    at java.nio.file.Files.delete(Files.java:1126) 
    at org.adroitlogic.x.transport.file.FileMessageInjector.finalizeProcessing(FileMessageInjector.java:161) 
    at org.adroitlogic.x.transport.file.FileMessageInjector.afterProcess(FileMessageInjector.java:123) 
    at org.adroitlogic.x.transport.file.FileMessageInjector.afterProcess(FileMessageInjector.java:37) 
    at org.adroitlogic.x.base.trp.ScheduledMessageInjector.lambda$2(ScheduledMessageInjector.java:72) 
    at org.adroitlogic.x.api.trp.MessageReceiver.lambda$receive$3(MessageReceiver.java:100) 
    at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760) 
    at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736) 
    at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474) 
    at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1962) 
    at org.adroitlogic.x.core.MessageContext.lambda$createNewResponseFuture$2(MessageContext.java:459) 
    at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760) 
    at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736) 
    at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474) 
    at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1962) 
    at org.adroitlogic.x.core.MessageContext.completeMessageFlowSuccessfully(MessageContext.java:332) 
    at org.adroitlogic.x.base.connector.EgressConnectorElement.sendMessage(EgressConnectorElement.java:185) 
    at org.adroitlogic.x.base.connector.EgressConnectorElement.process(EgressConnectorElement.java:146) 
    at org.adroitlogic.x.base.processor.AbstractProcessingElement.processMessage(AbstractProcessingElement.java:103) 
    at org.adroitlogic.x.base.processor.TraceableProcessingElement.processMessage(TraceableProcessingElement.java:53) 
    at org.adroitlogic.x.base.connector.IngressConnectorElement.receiveMessage(IngressConnectorElement.java:119) 
    at org.adroitlogic.x.core.IntegrationPlatform.lambda$receive$0(IntegrationPlatform.java:81) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
+0

File.delete() ziemlich alt API ist. Sie könnten versuchen, 'Files.delete (somePath)' zu verwenden, vielleicht erhalten Sie einen besseren Fehler/Ausnahme: http://stackoverflow.com/questions/12139482/difference-between-filesdeletepath-and-fileleelete – user140547

+0

Ich habe aktualisiert die Frage mit der Ausnahme, dass ich habe. – dammina

+0

Unter Windows können Sie keine Datei löschen, in der jemand (einschließlich Ihres eigenen Prozesses) eine Dateikennung geöffnet hat. Dies unterscheidet sich von Unix, wo Sie es immer löschen können (und sogar die geöffneten Dateideskriptoren später verwenden). Was Sie tun können (wenn es sich um eine temporäre Datei handelt, die gelöscht werden soll), können Sie deleteOnExit verwenden. Dies kann funktionieren, solange Ihr Prozess der einzige ist, der offene Dateideskriptoren hat. – eckes

Antwort

0

Verwenden Files.delete(filePath) statt file.delete() als file.delete() hat einige Problem auf Fenster in Bezug auf die Erlaubnis.

+0

Bitte beachten Sie die Frage Update. – dammina

+1

Es gibt keine Unterschiede zwischen den beiden APIs für diesen Fall. – eckes

+0

Es besagt, dass Ihre Datei in JVM geöffnet ist. Bitte versuchen Sie, die Datei zu schließen und versuchen Sie es erneut, da eine von JVM geöffnete Datei nicht gelöscht werden konnte. Hoffe es wird helfen. –

1

Willkommen bei Windows.

java.nio.file.FileSystemException: C:\Users\thuvvareka\Desktop\temp\in\sd.xml: 
The process cannot access the file because it is being used by another process. 

Normalerweise, wenn ein Prozess eine Datei geöffnet in Windows hat, sperrt das Betriebssystem die Datei in einer Weise, dass die Datei nicht gelöscht werden kann. Wenn Ihr Programm die Datei geöffnet hat, während Sie versuchen, sie zu löschen, schließen Sie die Datei zuerst und löschen Sie sie dann. Wenn es ein anderes Programm ist, das die Datei geöffnet hat, dann müssen Sie herausfinden, wer es geöffnet hat und von dort aus gehen.

Wenn ein Prozess unter Linux eine Datei geöffnet hat, verhindert normalerweise nichts das Löschen, weshalb Sie ein anderes Verhalten sehen.

0

Möglicherweise können Sie System.Runtime.exec() verwenden, um einen Terminal-/Befehlszeilenbefehl zum Löschen einer bestimmten Datei auszuführen. Dies kann irgendwie plattformabhängig sein, aber der Befehl, der in die Funktion exec() eingegeben werden soll, kann sich bei den os-Eigenschaften unterscheiden.

Sie können diesen Thread überprüfen, um das aktuelle Betriebssystem des laufenden Java-Programms zu ermitteln.

How do I programmatically determine operating system in Java?

In Linux, Ihre Linie sein würde, wie folgt:

System.Runtime.exec("rm <path to file>"); 
Verwandte Themen