我想使用java 7的WatchService来监控对目录的更改 它似乎试图锁定文件夹,如果它失败将抛出异常,但似乎没有提供任何方法在事先锁定它/检查它是否已被锁定。
我需要知道另一个进程当前是否正在使用某个目录。 由于我无法锁定它或打开它的流(因为它是一个目录),我正在寻找比尝试修改它更智能的东西,如果失败就会睡觉,或尝试/捕获睡眠。
理想情况下,我希望在可用之前进行阻止调用。
编辑: 我似乎无法在文件夹上获取FileLock。 当我尝试锁定文件夹时,我得到" FileNotFoundException(访问被拒绝)"。 谷歌搜索建议你不能在目录上使用该对象。
注册码:
WatchService watchService = path.getFileSystem().newWatchService()
path.register(watchService,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE)
失败的情况:
让我们说我正在收听f
文件夹以进行新创作
如果在其中创建了子文件夹g
,我想听取g
中的更改。
但是,如果我在f
(在Windows中)中创建一个新文件夹,则会失败,因为Windows会锁定该文件夹,直到给出一个名称。
由于
答案 0 :(得分:2)
取自here
File file = new File(fileName);
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
// Get an exclusive lock on the whole file
FileLock lock = channel.lock();
try {
lock = channel.tryLock();
// Ok. You get the lock
} catch (OverlappingFileLockException e) {
// File is open by someone else
} finally {
lock.release();
}
答案 1 :(得分:2)
在所有评论之后,由于您的问题特别适合Windows,我想建议以下库:
http://jpathwatch.wordpress.com/
如果您阅读了这些功能,则可以看到以下内容:
子目录的变化*(递归监控)
这就是你所需要的。似乎它为你做到了,而你不必手动注册每个新目录。它仅限于选定的平台。当检查时,它似乎只在Windows中可用!!!!见这里:http://jpathwatch.wordpress.com/documentation/features/
一个非常重要的事情是当观看的目录变得不可用时无效。 (使用java watch服务,它会监视一个目录并重命名,你仍然可以使用旧路径获取事件!!)
我认为这个库最优雅,在这种情况下会为你节省大量代码。