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)
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
Ich habe aktualisiert die Frage mit der Ausnahme, dass ich habe. – dammina
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