繁体   English   中英

Java - 如何在写入文件时检测文件删除?

[英]Java - How to detect file deletion while writing to a file?

我们的java程序不断地将一些重要数据写入文件。 现在我们想要在某些用户手动删除文件(java程序正在编写的文件)时抛出一些异常或在控制台上显示某种错误消息。

我发现java在尝试写入已删除的文件时不会抛出任何异常。

方法I -启动一个新线程,该线程将继续检查文件是否存在,并在删除文件时通知主java程序。 这在我们的情况下不起作用,因为我们将有几个java程序将要编写的文件,因此为每个文件启动一个新线程将不会有内存效率。

方法II -每次在写入文件之前检查文件是否存在。 这也不是一个好方法,因为检查文件存在是一个更昂贵的操作。

方法III -扩展java.io.FilterWriter (我们用来写入文件)并覆盖write()方法,以便在尝试写入已删除的文件时抛出异常。 这似乎是一个很好的解决方案,但我找不到任何地方Java正在消化一些异常(当它试图写入已被删除的文件时),我们可以通过覆盖该方法抛出该异常。

在这种情况下, FileChannelFileLock类可能会有所帮助。

请参阅如何使用java锁定文件(如果可能)

在Unix下,有文件和目录。 文件可以出现在任意数量的目录中,打开的文件可以在磁盘上但不会出现在任何目录中。 如果从更改目录的目录中删除文件,而不是文件。

要确定目录是否已更改,您需要使用File.exists()轮询其路径。 Java 7有一个目录观察器,可以避免轮询的需要。

首先,我怀疑,如果您尝试写入丢失的文件,java将不会抛出异常。 可能发生的情况是,在unix下,文件被用户删除但进程仍然写入备份文件(自己的副本)

看看apache commons io文件监视包: http//commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html基本上,你可以注册不同事件(文件删除,目录删除等)和监听器的监听器。

如果你想阻止删除,我会看一下@splash的评论。 另一种选择是写入您自己的临时目录中的隐藏文件。

  1. 在Unix,Linux,Solaris,MacOS,HP / UX,AIX等中,没有可能的方法来检测是否已删除打开的文件。

  2. 在Windows中,无法删除打开的文件。

所以你的问题没有明显的答案。

暂无
暂无

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

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