Перед продолжением убедитесь, что дерево папок заполнено

Я пишу программу типа "горячей папки", в которой файлы + папки, перетаскиваемые в мою назначенную папку загрузки, загружаются в облачный сервис.

Краткий обзор того, как я хочу сделать это:

  1. WatchService уведомляет меня, что что-то было перетащено в папку.
  2. Files.walkFileTree через перетаскиваемую папку, создавая папки в облачной службе для эмуляции структуры перетаскиваемой папки
  3. Загрузите файлы, с которыми я сталкиваюсь, в их соответствующие папки.

У меня проблема с поиском наиболее надежного способа убедиться, что мое вложенное дерево каталогов полностью скопировано в мою папку наблюдения. Метод walkFileTree "снимает" дерево каталогов сразу после вызова, поэтому он не может обнаружить папки, созданные после его вызова. Это вызывает проблему, потому что сама функция, которую я использую для обнаружения изменений, не увидит изменений, которые происходят после ее вызова.

Чтобы бороться с этим, я добавил Thread.sleep(3000) перед ходом, но это настолько произвольно и иногда терпит неудачу. Есть идеи как приручить этого зверя?

Существует ли обходчик дерева файлов в реальном времени, который не устанавливает древовидную структуру при вызове? Обречен ли я написать пользовательскую функцию? (Шучу, звучит весело.)

1 ответ

Решение

Нашел решение. Создайте простой инструмент проверки, чтобы убедиться, что дерево файлов полностью обновлено. FileUtils в Apache Commons имеет метод sizeOfDirectory, который может возвращать размер вложенного дерева каталогов.

// makes sure system has folder tree completely updated
private void waitFoldersComplete(Path child) throws InterruptedException {
    long folderSize;
    do {
        folderSize = FileUtils.sizeOfDirectory(child.toFile());
        System.out.println(folderSize);
        Thread.sleep(30);
    } while(folderSize < FileUtils.sizeOfDirectory(child.toFile()));
}

Надеюсь, что помогает другим в этой ситуации.

Другие вопросы по тегам