Java - 如何确定另一个进程是否正在使用某个目录?

时间:2013-08-10 15:52:11

标签: java nio java-io watchservice

我想使用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会锁定该文件夹,直到给出一个名称。

由于

2 个答案:

答案 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服务,它会监视一个目录并重命名,你仍然可以使用旧路径获取事件!!)

我认为这个库最优雅,在这种情况下会为你节省大量代码。