Перед продолжением убедитесь, что дерево папок заполнено
Я пишу программу типа "горячей папки", в которой файлы + папки, перетаскиваемые в мою назначенную папку загрузки, загружаются в облачный сервис.
Краткий обзор того, как я хочу сделать это:
- WatchService уведомляет меня, что что-то было перетащено в папку.
- Files.walkFileTree через перетаскиваемую папку, создавая папки в облачной службе для эмуляции структуры перетаскиваемой папки
- Загрузите файлы, с которыми я сталкиваюсь, в их соответствующие папки.
У меня проблема с поиском наиболее надежного способа убедиться, что мое вложенное дерево каталогов полностью скопировано в мою папку наблюдения. Метод 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()));
}
Надеюсь, что помогает другим в этой ситуации.