我在基于 Java 7 WatchService API 跟踪目录中文件内容的应用程序中遇到了一个反复出现的问题。当底层文件系统触发文件修改事件时,我想立即计算其 SHA-256。
但经常会发生另一个进程打开文件(即 Word),从而保留独占锁并阻止我的应用程序进行任何读/写操作。如果针对打开的文件创建了任何流/ channel ,则会抛出 FileNotFoundException 或 nio API 的 FileSystemException 以及如下消息:
The process cannot access the file because it is being used by another process
当文件在 fs 上实际上不存在时,我无法提供一种解决方案来检测此类情况而不屏蔽“真正的”FileNotFoundException。
我想出了通过 File.exists 检查是否存在的想法,然后如果在我打开流时抛出 FileNotFoundException,我将能够推断出文件已锁定。我愿意接受任何对此的意见!
谢谢!
最佳答案
您是否尝试过自己锁定文件?我假设您只有在未锁定且存在的情况下才能获取锁。
http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29
关于Java I/O : Ensure a file is not locked by another process before any r/w operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8802467/