首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java删除Windows中的文件失败

使用Java删除Windows中的文件失败
EN

Stack Overflow用户
提问于 2016-11-20 16:20:56
回答 5查看 8K关注 0票数 9

我一直试图使用Java删除windows操作系统中的一个文件。但是,它失败并返回false。在Ubuntu中,相同的代码就像一种魅力。

我已经验证了文件的权限允许程序删除它。此外,文件的所有输入和输出流都是以try的形式打开的。

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

使用调试器,我已经测试并发现,在我删除文件的代码行中,它返回true,以便进行以下API调用。

代码语言:javascript
复制
file.exists()
file.canRead();
file.canWrite();
file.canExecute();

在调用delete之前,我甚至尝试过添加System.gc(),以确保所有流都关闭。

不确定这是否是有用的信息,但我甚至尝试过使用Apache方法,但它也失败了。

我在这里错过了什么?

更新:

通过使用Files.delete(Paths.get(file.getAbsolutePath())),我得到了以下错误。

代码语言:javascript
复制
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)
EN

回答 5

Stack Overflow用户

发布于 2016-11-20 17:36:46

欢迎来到Windows。

代码语言:javascript
复制
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中打开一个文件时,通常没有什么可以阻止您删除它,这就是为什么您会看到不同的行为。

票数 3
EN

Stack Overflow用户

发布于 2019-04-30 05:50:01

我最近碰到了这个。我创建了一个解决方案,如果file.delete()返回false,我会检查file.exists()是否返回true,如果是,我会稍等一会儿,然后再试一次,然后在多次尝试之后放弃。

我未经证实的怀疑是,Windows上的病毒检查程序锁定文件以检查文件,等待允许病毒检查器完成。

代码语言:javascript
复制
            // 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;
                    }
票数 3
EN

Stack Overflow用户

发布于 2016-11-20 16:38:04

使用Files.delete(filePath)而不是file.delete(),因为file.delete()在windows上的权限方面有一些问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40706380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档