我的 Java 程序打开一个文件并慢慢地写入文件。操作完成后,程序关闭文件并将文件移动到另一个目录中的最终位置。问题是在操作运行时,同一个 Java 程序中的另一个线程删除了该文件。
Windows 不允许删除打开的文件。 Linux 允许文件在打开时被删除。在 NFS 文件系统上,Linux 会重命名该文件,然后在关闭时自动删除该文件。如何防止文件打开时被删除?
我如何找出删除文件的原因?如何在删除文件的程序中获取 Java 线程的调用堆栈?
更改文件所有者将不起作用,因为同一进程中的另一个线程正在删除该文件。
程序正在主动写入文件,因此删除文件的写权限将不起作用。删除目录的写权限也不起作用,因为该目录有其他正在创建和删除的文件。
该程序有 185k 行代码。整个代码中有许多对 File.delete()
的调用。我可以在 File.delete()
、Files.delete()
等上设置断点。但是,该程序正在快速创建和删除大量文件。这将产生大量的断点命中,使大海捞针。我可以将断点设置为有条件的,但程序会运行得很慢。
最佳答案
JDK 的文件锁定机制只保护文件不受其他进程的影响,而不是来自同一进程的线程。
所以,我写了一个读/写文件锁定框架。如果任何线程持有文件的读锁或写锁,则所有其他线程都无法写入或删除该文件。如果线程持有文件的读锁,则它不能写入或删除该文件。当线程对文件具有读取或写入锁定时,不能删除任何祖先目录。
这个框架很快就清除了错误。从那以后我就再也没有遇到过问题。
关于java - 防止和检测打开文件的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48347442/