我想使用java7的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会锁定该文件夹,直到给出名称为止。
感谢
从这里开始
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();
}
在所有评论之后,由于您的问题在windows中看起来很特殊,我想建议使用以下库:
http://jpathwatch.wordpress.com/
如果你阅读了这些功能,你可以看到以下内容:
子目录中的更改*(递归监视)
这正是你所需要的。似乎它可以为您做到这一点,而无需手动注册每个新目录。它仅限于选定的平台。检查时,它似乎只在windows中可用!!!!请参见此处:http://jpathwatch.wordpress.com/documentation/features/
一件非常重要的事情是,当被监视的目录变得不可用时,可能会使其无效。(使用java watch服务,如果一个目录被监控并被重命名,您仍然可以使用旧路径获得事件!!)
我认为这个库将是最优雅的,并且将为您节省大量的代码。