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

标签 java windows io nio

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

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 机器上启动应用程序时会发生这种情况,而在 docker 中不会发生这种情况。当我在 MacOS 上本地运行应用程序时,我也没有遇到这样的错误。有什么问题以及如何解决它?

最佳答案

检查该文件是否未被其他进程打开。此检查可以通过 Process Explorer 完成。 。启动程序后,在菜单中选择Find,然后选择Find Handle or DLL...,或按Ctrl+F。输入被某个进程锁定的文件的名称,然后单击搜索

Windows 和类 Unix 操作系统在处理已打开文件的删除方面存在差异。

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

在 Windows 上,任何进程都不能打开该文件才能成功执行低级文件删除操作。

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

关于java - 如何删除Windows上的临时文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57820722/

相关文章:

windows - OpenCV-内存训练不足

c - 将 void * 缓冲区用作 char * 以外的任何缓冲区是否合法?

java - 在 JPQL 查询中过滤结果

Java 代码约定 : must match pattern '^[a-z][a-zA-Z0-9]*$'

java - Java 类中的默认可见性可以有 protected 成员吗?

python - 如何使用 Python 访问文件元数据?

java - 尝试将文件上传到 JAX-RS( Jersey )服务器

python - 使用 setup.py 链接 library.lib

android - 在不首先打开文件的情况下在 Android 上生成 FileDescriptor

c - Linux 串行 IO - 在两个线程之间拆分 Tx 和 Rx?