【发布时间】:2020-01-09 06:08:10
【问题描述】:
在某个地方我创建了临时文件:
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打开了文件。也许您已经用记事本或其他工具打开了文件以检查文件而不是关闭它?
-
确保您的代码正在关闭所有 InputStreams、OutputStreams、Readers 和 Writers。
-
@VGR 我提供了所有与 IO 相关的代码
-
当我重新阅读您的问题时,您的错误消息和您对您正在做什么的解释与您的代码不符。你创建一个目录,做一些事情,然后删除......究竟是什么?
somePath是createTempDirectory返回的路径吗?要删除目录,该目录必须为空。但是,错误消息指向该目录中的文件。你能创建一个Minimal, reproducable example 吗?要么你自己发现错误,要么让我们更容易理解发生了什么。 -
“所有与IO相关的代码”?您是说没有其他代码行可以使用您创建的临时目录吗?如果是这样,为什么要首先创建它?