Java: Наблюдение каталога для перемещения больших файлов

Я писал программу, которая смотрит каталог и когда файлы создаются в нем, это меняет имя и перемещает их в новый каталог. В моей первой реализации я использовал Сервис Часов Java API, который хорошо работал, когда я тестировал файлы 1 КБ. Проблема, которая подошла, состоит в том, что в действительности создаваемые файлы где угодно от 50-300mb. Когда это произошло наблюдатель, API найдет файл сразу же, но не мог переместить его, потому что он все еще писался. Я пытался поместить наблюдателя в цикл (какие исключительные ситуации, пока файл не мог быть перемещен), но это казалось довольно неэффективным.

Так как это не работало, я пытался использовать таймер, который проверяет папку каждый 10-е и затем перемещает файлы, когда она может. Это - метод, для которого я закончил тем, что шел.

Вопрос: там должен так или иначе сигнализировать, когда файл сделан, будучи записанным, не делая проверки исключения или постоянно сравнивая размер? Мне нравится идея использовать Наблюдателя API только однажды для каждого файла вместо того, чтобы постоянно свериться с таймером (и столкнуться с исключениями).

Все ответы значительно ценятся!

nt

28
задан nite 30 July 2010 в 07:17
поделиться

3 ответа

Записать другой файл, чтобы указать, что исходный файл завершен. Например, 'fileorg.dat' увеличивается, если вы сделали, создайте файл 'fileorg.done' и проверьте только для 'fileorg.done'.

С умным соглашением об именах у вас не должно возникнуть проблем.

11
ответ дан 28 November 2019 в 03:15
поделиться

Два решения:

Первое - небольшая вариация ответа stacker:

Используйте уникальный префикс для неполных файлов. Что-то вроде myhugefile.zip.inc вместо myhugefile.zip. Переименуйте файлы после завершения загрузки/создания. Исключите из просмотра файлы .inc.

Второй вариант - использовать другую папку на том же диске для создания / загрузки / записи файлов и переместить их в наблюдаемую папку, когда они будут готовы. Перемещение должно быть атомарным действием, если они находятся на одном диске (полагаю, зависит от файловой системы).

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

9
ответ дан 28 November 2019 в 03:15
поделиться

Я предполагаю, что java.io.File.canWrite () сообщит вам, когда файл был записан.

-1
ответ дан 28 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: