我一直在尝试使用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)
答案 0 :(得分:1)
使用Files.delete(filePath)
代替file.delete()
因为file.delete()
在Windows上的权限方面存在一些问题。
答案 1 :(得分:1)
欢迎使用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.
通常,当进程在Windows中打开文件时,操作系统会以无法删除文件的方式锁定文件。如果您尝试删除文件时打开文件的程序,请先关闭文件然后将其删除。如果它是另一个打开文件的程序,那么你需要找出谁打开它并从那里开始。
当进程在Linux中打开文件时,通常没有什么可以阻止您删除它,这就是您看到不同行为的原因。
答案 2 :(得分:0)
也许您可以使用System.Runtime.exec()运行终端/命令行命令来删除特定文件。这可能是某种程度上依赖于平台的,但是输入到exec()函数的命令可能在os属性中有所不同。
您可以检查此线程以确定正在运行的java程序的当前操作系统。
How do I programmatically determine operating system in Java?
在linux中,您的行如下:
System.Runtime.exec("rm <path to file>");
答案 3 :(得分:0)
我最近遇到了这个问题。我创建了一种变通方法,其中如果file.delete()
返回false,请检查file.exists()
是否返回true,如果是,我稍等一下,然后重试,并在尝试了几次后放弃。
我未经证实的怀疑是Windows上的病毒检查器锁定了文件以检查文件,并等待病毒检查器完成。
// Remove the original file.
if(!file.delete()) {
// wait a bit then retry on Windows
if (file.exists())
{
for (int i = 0; i < 6; i++)
{
Thread.sleep(500);
System.gc();
if (file.delete())
break;
}
答案 4 :(得分:0)
我遇到了同样的问题。
请out.close();
解决它。
System.gc() 不会删除指向 OutputStream 的链接,只要您没有关闭它。