9

我在基于 Java 7 WatchService API 跟踪目录中文件内容的应用程序中遇到了一个反复出现的问题。当底层文件系统对文件触发修改事件时,我想立即计算其 SHA-256。

但是经常发生另一个进程打开了文件(即 Word),从而保留了排他锁并阻止我的应用程序进行任何读/写操作。如果针对打开的文件创建了任何流/通道,则会抛出用于 nio API 的 FileNotFoundException 或 FileSystemException,并带有如下消息:

该进程无法访问该文件,因为它正被另一个进程使用

当文件实际上不存在于 fs 上时,我无法提供一种解决方案来检测此类情况,而不会掩盖“真实”的 FileNotFoundException。

我想出了通过 File.exists 检查存在性的想法,然后如果在打开流时抛出 FileNotFoundException,我将能够推断出文件已被锁定。我对这方面的任何意见持开放态度!

谢谢!

4

2 回答 2

1

您是否尝试过自己锁定文件?我假设您只能在未锁定且存在的情况下获取锁。

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29

于 2012-01-10T11:25:10.007 回答
0

跨进程共享文档很棘手,尤其是在不使用专用文件系统(如 GFS 可以)时。我不认为 Java 锁定 API 可能对您有太大帮助,我认为您的尝试想法是正确的/fail strategy ... 使用 java 7,您可以使用 WatchService 来监视文件更改,然后按照您的业务需求进行操作...您使用哪种系统?Windows 在永恒期间保持对文件的句柄...

HTH杰罗姆

于 2012-01-10T12:16:38.897 回答