2011-11-13 10 views
7

Tôi đang sử dụng các tính năng mới của Java7 để xem thư mục cho những thay đổi (như được mô tả trong hướng dẫn sau đây: http://download.oracle.com/javase/tutorial/essential/io/notification.html)Java nio FileSystem Watcher khóa danh bạ. Xóa trở nên bất khả thi

Các theo dõi bản thân công trình (gần) không có vấn đề.

Ít hoặc nhiều tôi có hai vấn đề và tôi hy vọng một số bạn có ý tưởng về cách xử lý.

  1. Sau khi thư mục được thêm vào xem, VM có quyền truy cập vào nó và nó không phát hành. Đây không phải là một vấn đề lớn. Nhưng nếu bạn đang tạo một thư mục trong một thư mục khác và trong thư mục này nữa. (ví dụ: bạn tạo trong thư mục c:\tmp\a thư mục b và trong b thư mục c (c:\tmp\a\b\c)) không thể xóa thư mục a, do quyền truy cập của máy ảo vào bc. Nếu bạn muốn xóa tất cả các thư mục (ví dụ: với Windows Explorer), bạn phải xóa c trước, sau đó b và sau đó a. Thật kỳ lạ, nhưng cách này hoạt động (mặc dù là bất tiện)

  2. Sự cố này có vẻ là kết quả của sự kiện đầu tiên. Nếu nhiều thay đổi trong a xảy ra đôi khi (nhiều hơn hoặc ít hơn), tôi nhận được một ngoại lệ cho tôi biết, thư mục mới được tạo ra được sử dụng bởi một quy trình khác và không thể truy cập vào nó. Thật kỳ lạ, bởi vì tôi nghĩ điều này không quan trọng để nhận được thông báo. Và bởi vì nó không phải là hoàn toàn rõ ràng khi chính xác ngoại lệ này được ném.

Bạn có ý tưởng làm cách nào để không thể khóa hoặc ít nhất là để người dùng có khả năng xóa cấu trúc thư mục theo cách thuận tiện cổ điển?

Trả lời

1

Vâng, tôi đã thử mã giới thiệu trong liên kết mà bạn đăng, làm những điều tương tự như bạn đang cố gắng để làm:

Trong c của tôi: thư mục temp \ tôi tạo programatically ac: \ temp \ a dir và sau đó ac: \ temp \ thư mục \ 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(); 
     } 

sau đó, tôi thêm sát đến "a" và "b" thư mục:

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(); 
     } 
    } 

này hoạt động ok, nếu tôi sửa đổi tập tin trong "a" hoặc "b" tôi nhận được conso tương ứng đầu ra le.

Đúng là với Windows Explorer (trên máy XP Windowsx) tôi không thể xóa thư mục đã xem (nó cho tôi biết tôi không có quyền truy cập). Tuy nhiên tôi có thể xóa nó với các công cụ khác như Total Commander. Tôi thậm chí có thể xóa sau đó từ dòng lệnh Windows với rd c:\temp\a\b. Tôi cho rằng đây là vấn đề với Windows Explorer hơn là với Java ...

-1

liên quan đến vấn đề thứ 2 của bạn, nếu bạn đang nhận ngoại lệ "thư mục mới được tạo ra được sử dụng bởi một quy trình khác và không thể Truy cập nó". Bạn có thể thử sử dụng Hoạt động nguyên tử trong mã của mình. điều này sẽ giúp các hoạt động không bị gián đoạn và CÓ THỂ giải quyết vấn đề của bạn.