JavaNIO文件系统监视程序锁定目录。删除变得不可能

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资源管理器),必须先

我正在使用Java7的新特性来监视目录的更改(如以下教程所述:)

观看本身(几乎)没有问题

或多或少我有两个问题,我希望你们中的一些人知道如何处理

  • 将文件夹添加到监视后,VM可以访问该文件夹,但不会释放该文件夹。这不应该是什么大问题。但是如果你在另一个目录中创建一个目录,并且在这个目录中创建更多。(例如,您在目录
    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){}
    
    列出关于第二个问题,如果您遇到异常“新创建的文件夹被另一个进程使用,无法访问”。您可以尝试在代码中使用原子操作。这将有助于操作不被中断,并可能解决您的问题