JavaNIO文件系统监视程序锁定目录。删除变得不可能
我正在使用Java7的新特性来监视目录的更改(如以下教程所述:) 观看本身(几乎)没有问题 或多或少我有两个问题,我希望你们中的一些人知道如何处理JavaNIO文件系统监视程序锁定目录。删除变得不可能,java,nio,filesystemwatcher,java-7,Java,Nio,Filesystemwatcher,Java 7,我正在使用Java7的新特性来监视目录的更改(如以下教程所述:) 观看本身(几乎)没有问题 或多或少我有两个问题,我希望你们中的一些人知道如何处理 将文件夹添加到监视后,VM可以访问该文件夹,但不会释放该文件夹。这不应该是什么大问题。但是如果你在另一个目录中创建一个目录,并且在这个目录中创建更多。(例如,您在目录c:\tmp\a中创建目录b,并在b中创建目录c(c:\tmp\a\b\c))无法删除目录a,因为VM可以访问b和c)。如果要删除所有文件夹(例如,使用Windows资源管理器),必须先
c:\tmp\a
中创建目录b
,并在b
中创建目录c
(c:\tmp\a\b\c
))无法删除目录a
,因为VM可以访问b
和c
)。如果要删除所有文件夹(例如,使用Windows资源管理器),必须先删除c
,然后删除b
,然后删除a
。这很奇怪,但这种方式有效(尽管不方便)a
中有时(或多或少)发生许多更改,我会收到一个异常,它告诉我,新创建的文件夹被另一个进程使用,无法访问它。这很奇怪,因为我认为这不应该是得到通知的问题。因为不完全清楚这个异常是在什么时候抛出的你有没有办法让它不带锁,或者至少让用户能够以传统的方便方式删除这样的目录结构?我已经尝试了你发布的链接中显示的代码,做了与你尝试做的相同的事情: 在我的c:\temp目录中,我通过编程创建了一个c:\temp\a目录,然后创建了一个c:\temp\a\b目录:
File startDir = new File("c:\temp");
if(!startDir.exists()) {
startDir.mkdir();
}
File aDir = new File("c:\\temp\\a");
File bDir = new File("c:\\temp\\a\\b");
if(!aDir.exists()) {
aDir.mkdir();
}
if(!bDir.exists()) {
bDir.mkdir();
}
然后我将观察者添加到“a”和“b”目录:
public static void watch(final File dir,final WatchService watcher) {
Path path = dir.toPath();
try {
final WatchKey bDirWatchKey = path.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
new Thread(new Runnable() {
public void run() {
System.out.println("Watching: "+dir.getName());
while(true) {
try {Thread.sleep(1000);} catch (InterruptedException e) {}
List<WatchEvent<?>> events = bDirWatchKey.pollEvents();
for(WatchEvent<?> event:events) {
System.out.println(dir.getName()+" event: #"+event.count()+","+event.kind()+" File="+event.context());
}
}
}
}).start();
} catch (IOException x) {
x.printStackTrace();
}
}
公共静态无效监视(最终文件目录,最终监视服务监视程序){
路径路径=dir.toPath();
试一试{
final WatchKey bDirWatchKey=path.register(watcher,StandardWatchEventKinds.ENTRY\u MODIFY);
新线程(newrunnable()){
公开募捐{
System.out.println(“监视:+dir.getName());
while(true){
试试{Thread.sleep(1000);}catch(InterruptedException e){}
列出关于第二个问题,如果您遇到异常“新创建的文件夹被另一个进程使用,无法访问”。您可以尝试在代码中使用原子操作。这将有助于操作不被中断,并可能解决您的问题