繁体   English   中英

如何删除Windows上的临时文件?

[英]How to remove temporary files on windows?

在某个地方,我创建了临时文件:

Files.createTempDirectory("chunk");

处理后,在其他地方,我尝试删除文件:

Files.deleteIfExists(somePath) 

并经历以下跟踪:

java.nio.file.FileSystemException: C:\....\Temp\chunk11607697185854596263\chunk-3.csv: The process cannot access the file because it is being used by another process.
    at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
        at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:270)
        at java.base/sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:110)
        at java.base/java.nio.file.Files.deleteIfExists(Files.java:1180)
        at my.some.project.batch.MyClass.afterStep(MyClass.java:31)

当我在本地Windows mashine上启动应用程序时会发生这种情况,而在docker中则不会发生。 当我在MacOS上本地运行应用程序时,我也没有遇到这种错误。 有什么问题,我该如何解决?

检查文件是否被其他进程打开。 可以使用Process Explorer进行此检查。 启动程序后,在菜单中选择“ Find ”,然后选择“ Find Handle or DLL... ,或按Ctrl+F 输入被某个进程锁定的文件的名称,然后单击“ Search

Windows和类似Unix的操作系统在处理已打开文件的删除方面有所不同。

在类似Unix的系统上,即使文件被其他进程打开,也可以将其删除。 直到所有其他进程关闭了该文件后,才会删除实际文件,但文件系统上的文件名条目将被删除。 第一部分操作成功后,低级文件删除操作将返回成功。 实际文件数据的删除被延迟到打开计数达到0为止。

在Windows上,该文件可能无法通过任何进程打开,以便低级文件删除操作能够成功进行。

这可能是为什么在Windows和Docker或MacOS上运行程序时看到不同行为的原因。

在Windows中使用Java删除文件时,存在很多问题。 最重要的是,如已经提到的VGR一样,在尝试删除文件之前,请务必确保没有未关闭的流。

有关常见问题的更多信息,您可以查看以下内容: delete&GC和this: 文件删除

我正在使用这种看起来很糟糕的“解决方案”来删除文件,请随时尝试:

public static boolean deleteFile(File file)
        throws Exception {
    if (!file.exists()) {
        throw new Exception("File not found: " + file.getName());
    }
    try {
        file.setWritable(true);
    } catch (Exception ignored) {
    }
    int delay = 50;
    for (int i = 0; i < 20; i++) {
        if (file.delete()) {
            return true;
        }
        System.gc();
        try {
            Thread.sleep(delay);
        } catch (InterruptedException ignored) {
        }
        delay = delay + 50;
    }
    throw new Exception("Could not delete the file '"
            + file.getName() + "'");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM