Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—如何确定另一个进程是否正在使用某个目录?_Java_Nio_Java Io_Watchservice - Fatal编程技术网

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

Java—如何确定另一个进程是否正在使用某个目录?,java,nio,java-io,watchservice,Java,Nio,Java Io,Watchservice,我想使用java 7的WatchService监视对目录的更改。 它似乎试图锁定文件夹,如果失败将抛出异常,但似乎没有提供任何手动锁定/检查是否已锁定的方法 我需要知道另一个进程当前是否正在使用某个目录。 因为我无法锁定它或打开它的流(因为它是一个目录),所以我正在寻找比尝试修改它并在失败时休眠,或者尝试使用sleep/catch更智能的方法 理想情况下,我想要一个阻塞呼叫,直到它可用 编辑: 我似乎无法获取文件夹上的文件锁。 当我试图锁定文件夹时,我得到“FileNotFoundExcepti

我想使用java 7的WatchService监视对目录的更改。
它似乎试图锁定文件夹,如果失败将抛出异常,但似乎没有提供任何手动锁定/检查是否已锁定的方法

我需要知道另一个进程当前是否正在使用某个目录。 因为我无法锁定它或打开它的流(因为它是一个目录),所以我正在寻找比尝试修改它并在失败时休眠,或者尝试使用sleep/catch更智能的方法

理想情况下,我想要一个阻塞呼叫,直到它可用

编辑: 我似乎无法获取文件夹上的文件锁。 当我试图锁定文件夹时,我得到“FileNotFoundException(拒绝访问)”。 谷歌搜索表明你不能在目录上使用该对象

注册代码:

WatchService watchService = path.getFileSystem().newWatchService()
path.register(watchService,
                    StandardWatchEventKinds.ENTRY_CREATE,
                    StandardWatchEventKinds.ENTRY_MODIFY,
                    StandardWatchEventKinds.ENTRY_DELETE)
失败场景:
假设我正在收听一个文件夹
f
,用于新创建。
如果在其中创建了子文件夹
g
,我想听听
g
中的更改。 但是,如果我在
f
(在Windows中)中创建一个新文件夹,这将失败,因为Windows将锁定该文件夹,直到给出名称为止

谢谢

摘自

取自


在所有的评论之后,由于您的问题对于windows来说是特殊的,我想建议使用以下库:

如果您阅读功能,您可以看到以下内容:

子目录中的更改*(递归监视)

这就是你需要的。似乎它为您做到了这一点,而您不必手动注册每个新目录。它仅限于选定的平台。当检查时,它似乎只在windows中可用!!!!请看这里:

非常重要的一点是,当监视的目录变得不可用时,它可能会失效。(使用java watch服务,如果一个目录被监视并被重命名,您仍然可以得到具有旧路径的事件!!)


我认为该库将是最优雅的库,并将为您节省大量代码。

在所有评论之后,由于您的问题对于windows来说是特定的,我想建议使用以下库:

如果您阅读功能,您可以看到以下内容:

子目录中的更改*(递归监视)

这就是你需要的。似乎它为您做到了这一点,而您不必手动注册每个新目录。它仅限于选定的平台。当检查时,它似乎只在windows中可用!!!!请看这里:

非常重要的一点是,当监视的目录变得不可用时,它可能会失效。(使用java watch服务,如果一个目录被监视并被重命名,您仍然可以得到具有旧路径的事件!!)


我认为此库将是最优雅的库,并将为您节省大量代码。

我已经尝试过,但每当我尝试锁定文件时,我都会得到“FileNotFoundException(拒绝访问)”。我已经尝试过,但每当我尝试锁定文件时,我都会得到“FileNotFoundException(拒绝访问)”。如果您只想监视它的更改,为什么需要知道它是否正在被另一个进程使用?因为方法寄存器()如果目录正在使用中,哪个注册表的更改会引发异常。@Gal您能发布一些代码吗?检查本教程并与您的代码进行比较,找出差异,也许您会看到一些东西:您得到的异常是什么?如果在发出通知时由于文件夹尚未在windows中命名而出现错误,则可能会捕获该错误并忽略它(例如,在该错误中,如果未设置文件对象的名称,请检查该错误)。最可能的情况是,在windows中完成名称设置后,将生成另一个事件,这次是全名事件。更好的是,如果通知中的文件名为null或为空,请尝试不注册,然后继续等待。如果您只想监视它的更改,为什么需要知道它是否正在被另一个进程使用?因为方法register()如果目录正在使用中,哪个注册表的更改会引发异常。@Gal您能发布一些代码吗?检查本教程并与您的代码进行比较,找出差异,也许您会看到一些东西:您得到的异常是什么?如果在发出通知时由于文件夹尚未在windows中命名而出现错误,则可能会捕获该错误并忽略它(例如,在该错误中,如果未设置文件对象的名称,请检查该错误)。最可能的情况是,在windows中完成名称设置后,将生成另一个事件,这次是全名事件。更好的是,如果通知中的文件名为null或为空,请尝试不注册,然后继续等待。谢谢,但我确实在寻找解决我最初问题的方法,即找出另一个进程是否正在使用某个目录。我已经通过使用try-catch-sleep解决了这个问题。谢谢,但我确实在寻找解决我最初问题的方法,那就是找出一个目录是否正被另一个进程使用。我已经通过使用try-catch-sleep临时解决了这个问题。
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();
}