我在基于Java 7 WatchService API跟踪目录中文件内容的应用程序中遇到了一个经常出现的问题。当底层文件系统触发文件的修改事件时,我想立即计算其SHA-256。
但是经常会发生另一个进程打开文件(即Word),因此会扣留一个独占锁并阻止我的应用程序进行任何读/写操作。如果针对打开的文件创建了任何Stream / Channel,则会抛出Nio API的FileNotFoundException或FileSystemException,并显示如下消息:
该进程无法访问该文件,因为该文件正由另一个进程
使用
当文件实际上不存在于fs上时,我无法提供能够检测到此类情况而不屏蔽“真正的”FileNotFoundException的解决方案。
我想出了通过File.exists检查存在的想法,然后如果在打开流时抛出FileNotFoundException,我将能够推断该文件已被锁定。我愿意接受任何意见!
谢谢!
答案 0 :(得分:1)
您是否尝试过自己锁定文件?我认为如果它没有锁定并存在,你只能获得一个锁。
http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29
答案 1 :(得分:0)
跨进程共享文档很棘手,尤其是在不使用专用文件系统时(如GFS可以)..我不认为Java锁定API可能会对您有所帮助,我认为您的想法是正确的尝试/失败策略...使用java 7,您可以使用WatchService监视文件更改,然后按照您的业务要求进行操作...您使用什么类型的系统? Windows在永恒期间保留文件句柄......
HTH 杰罗姆