2016-12-30 2 views
-1

У меня есть программа, которая отслеживает любые изменения в каталоге.Ошибка пути к файлу Путь в java

Это выход программы.

C:\REST API\source\data_id.txt 

The new file :data_id.txtEvent :ENTRY_CREATE 

C:\REST API\source\New folder  

The new file :New folderEvent :ENTRY_CREATE 

C:\REST API\source\NhuPhutBanDau-NooPhuocThinh-4549467.doc 

The new file :NhuPhutBanDau-NooPhuocThinh-4549467.docEvent :ENTRY_CREATE 

Моя программа контролирует каталог C:/REST API/source корневой каких-либо изменений. Когда я копирую файл data_id.txt в корневой каталог, он может обнаруживать новый файл, как показано выше в выводе и в каталоге.

После этого, когда я пытаюсь создать папку, он также может обнаружить, что есть новая папка и показывает каталог новой папки на выходе.

Но проблема в том, что когда я пытаюсь поместить файл во вновь созданную папку, он снова сможет обнаруживать изменения в новой папке C:\REST API\source\New folder, которая не является корневым каталогом, установленным в моей программе, которая равна C:\REST API\source.

Мне нужна программа для обнаружения изменений только в корневом каталоге.

Может ли кто-нибудь направить меня на это?

Это мой исходный код:

public class fileStatus { 

    private final WatchService svc = null; 
    private final HashMap<WatchKey , Path> keyMap = null; 

    public static void main(String [] args) throws FileNotFoundException, IOException, JSONException, InterruptedException 
    { 
    try(WatchService svc = FileSystems.getDefault().newWatchService()) 
     { 
      Map<WatchKey, Path> keyMap = new HashMap<>(); 
      Path path = Paths.get("C:/REST API/source/"); 
      fileStatus fs = new fileStatus(); 
      fs.registerAll(path,keyMap,svc); 
      WatchKey wk ; 
      do 
      { 

       wk = svc.take(); 
       Path dir = keyMap.get(wk); 
       for(WatchEvent<?> event : wk.pollEvents()) 
       { 
        WatchEvent.Kind<?> type = event.kind(); 
        Path fileName = (Path)event.context(); 
        Path child = path.resolve(fileName); 
        System.out.println(child); 
        if (Files.isDirectory(child, LinkOption.NOFOLLOW_LINKS)) 
        { 
         if(type == StandardWatchEventKinds.ENTRY_CREATE) 
         { 
          registerAll(child,keyMap,svc); 
         } 
        } 
        System.out.println("\nThe new file :"+fileName+ "Event :" +type); 
       } 
      }while(wk.reset()); 
     } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 

    } 

    private static void registerAll(Path path, Map<WatchKey, Path> keyMap, WatchService svc) throws IOException 
    { 
     Files.walkFileTree(path,new SimpleFileVisitor<Path>() 
       { 
        public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs) throws IOException 
        { 
         if(attrs.isDirectory()) 
         { 
          keyMap.put(path.register(svc, StandardWatchEventKinds.ENTRY_CREATE),path); 
         } 
         return FileVisitResult.CONTINUE; 
        } 
       }); 

    } 

} 
+0

* Компилятор * Java, конечно, не отображается, что выход. * Ваша программа * есть. – Andreas

+0

Задайте себе этот вопрос: Какова цель 'keyMap'? – Andreas

+0

использовать для регистрации службы наблюдения и события – attack

ответ

1

Есть несколько мест, где вы регистрирующие путь для создания файла мониторинга, который не является необходимым.

  1. Вы можете удалить весь этот блок из вашего main метода

      if (Files.isDirectory(child, LinkOption.NOFOLLOW_LINKS)) { 
           if (type == StandardWatchEventKinds.ENTRY_CREATE) { 
            registerAll(child, keyMap, svc); 
           } 
          } 
    
  2. Вы не должны делать дерево ходить в методе registerAll. Таким образом, вместо этого,

    Files.walkFileTree(path,new SimpleFileVisitor<Path>() 
    { 
        public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs) throws IOException 
        { 
         if(attrs.isDirectory()) 
         { 
          keyMap.put(path.register(svc, StandardWatchEventKinds.ENTRY_CREATE),path); 
         } 
         return FileVisitResult.CONTINUE; 
        } 
    }); 
    

Просто используйте:

keyMap.put(path.register(svc, StandardWatchEventKinds.ENTRY_CREATE),path); 

Приведенные выше фрагменты кода добавления внутренние папки корневого каталога рекурсивно клавиатурная раскладка. Вот почему вы видите неожиданное поведение.

Надеюсь, это поможет!

+0

Я тестировал ваш метод раньше, когда я пытаюсь создать новую папку, он способен обнаруживать, но когда я пытаюсь поместить файл в новую созданную папку, он не сможет обнаружить новый файл, поэтому я разрабатываю свою программу как что в соответствии с материалами, которые я нашел онлайн – attack

+0

Но разве вы не сказали, что вы должны отслеживать только каталог * root *, а не подпапки? – anacron

Смежные вопросы