【发布时间】:2017-04-04 00:49:06
【问题描述】:
我一直在尝试使用 Java IO file.delete() API 在 Windows 操作系统中删除文件。但是它失败并返回false。相同的代码在 Ubuntu 中就像一个魅力。
我已验证该文件的权限允许程序将其删除。此外,该文件的所有输入和输出流都已作为资源尝试打开。
try (InputStream in = new FileInputStream(localFile); OutputStream out = new FileOutputStream(destinationFileName))
使用我测试过的调试器发现,在我删除文件的代码行中,它返回 true 用于后续 API 调用。
file.exists()
file.canRead();
file.canWrite();
file.canExecute();
我什至尝试在调用 delete 之前添加 System.gc() 以确保所有流都已关闭。
不确定这是否是有用的信息,但我什至尝试使用 Apache commons FileUtils.forceDelete(file) 方法,但也失败了。
那么我在这里错过了什么?
更新:
通过使用Files.delete(Paths.get(file.getAbsolutePath())),我得到了以下错误。
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() 是相当老的 API。你可以尝试使用
Files.delete(somePath),所以也许你会得到更好的错误/异常:见stackoverflow.com/questions/12139482/… -
我已经更新了这个问题,但我得到了例外。
-
在 Windows 上,您无法删除任何人(包括您自己的进程)打开了文件句柄的文件。这与 Unix 不同,在 Unix 中您可以随时删除它(甚至在之后使用打开的文件描述符)。你可以做什么(如果它是一个应该被删除的临时文件)你可以使用 deleteOnExit,只要你的进程是唯一一个打开文件描述符的进程,这可能会起作用。
-
@eckes 但是我尝试使用以下简单代码 sn-p 并且它已成功删除该文件。
File file = new File("C:\\Users\\thuvvareka\\Desktop\\temp\\in\\sd.xml"); try (FileInputStream fis = new FileInputStream(file)){ System.out.println(fis.getChannel().size()); } catch (IOException e){ e.printStackTrace(); } System.out.println(file.delete());输出: '0 true' -
是的,在您的示例中,文件在被删除之前已关闭。
标签: java windows file io ultraesb