java - 防止和检测打开文件的删除

标签 java file delete-file

我的 Java 程序打开一个文件并慢慢地写入文件。操作完成后,程序关闭文件并将文件移动到另一个目录中的最终位置。问题是在操作运行时,同一个 Java 程序中的另一个线程删除了该文件。

Windows 不允许删除打开的文件。 Linux 允许文件在打开时被删除。在 NFS 文件系统上,Linux 会重命名该文件,然后在关闭时自动删除该文件。如何防止文件打开时被删除?

我如何找出删除文件的原因?如何在删除文件的程序中获取 Java 线程的调用堆栈?

更改文件所有者将不起作用,因为同一进程中的另一个线程正在删除该文件。

程序正在主动写入文件,因此删除文件的写权限将不起作用。删除目录的写权限也不起作用,因为该目录有其他正在创建和删除的文件。

该程序有 185k 行代码。整个代码中有许多对 File.delete() 的调用。我可以在 File.delete()Files.delete() 等上设置断点。但是,该程序正在快速创建和删除大量文件。这将产生大量的断点命中,使大海捞针。我可以将断点设置为有条件的,但程序会运行得很慢。

最佳答案

JDK 的文件锁定机制只保护文件不受其他进程的影响,而不是来自同一进程的线程。

所以,我写了一个读/写文件锁定框架。如果任何线程持有文件的读锁或写锁,则所有其他线程都无法写入或删除该文件。如果线程持有文件的读锁,则它不能写入或删除该文件。当线程对文件具有读取或写入锁定时,不能删除任何祖先目录。

这个框架很快就清除了错误。从那以后我就再也没有遇到过问题。

关于java - 防止和检测打开文件的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48347442/

相关文章:

java - 将 ArrayList 拆分为多个 ArrayList

python直接将字符串写入tarfile

C# 解压缩后删除 .ZIP 文件

linux - 删除目录中的文件并打印删除的文件名

javascript - 如何确定 JavaScript 中的操作系统路径分隔符?

node.js - 使用 MongoDB 删除 Node.js 中上传的文件

java - 如何在 TestNG.xml 文件的类路径中使用正则表达式

java - Maven 配置文件在子模块中看不到依赖关系

java - JAXB 父节点和子节点同名。子节点返回空值

javascript - Ruby on Rails - 在 View 文件夹目录中添加额外的 JavaScript 文件是否正确?