2014-07-16 1 views
0

Я пишу программу java для передачи файлов .gz из одного места в другое место на том же сервере. Существует несколько каталогов, и каждый каталог имеет .gz-файлы. Структура выглядит так:Лучшая практика для копирования заархивированных файлов в каталог назначения и uncompress

-- dir1 

    -- 1.gz 

    -- 2.gz 
-- dir1 

    -- 1.gz 

    -- 2.gz 

Существует около 100 каталогов и каждый из них содержит некоторые .gz-файлы. Количество файлов .gz внутри каждого каталога увеличивается в определенный период. Мой подход заключался в том, чтобы скопировать исходные файлы в каталог temp, распаковать файлы в каталоге temp и затем перенести эти файлы в пункт назначения. Является ли этот подход разумным? Есть ли какая-нибудь лучшая практика, которую я могу использовать для такого рода передачи файлов?

ответ

0

Я понимаю, что вы хотите распаковать файлы в целевом назначении. Вы хотите, чтобы цель была как можно более актуальной («онлайн-операция»), или это одноразовая задача, и вам не нужно продолжать повторять операцию после ее завершения? Если вы используете это как онлайн-операцию, вы должны использовать WatchService для поиска изменений. В unix-подобной среде (весьма вероятно, поскольку .gz в основном используется в unix), это использует системный вызов inotify и очень эффективен.

Это проблема, если вы получаете противоречивое состояние? То есть, если файлы dir1/3.gz и dir2/3.gz были обновлены одновременно, это проблема, если dir1/3.gz скопирована, но dir2/3.gz нет? Вы можете защитить данные данные от

  • проверка целостности копии перед завершением операции. Это будет включать отказ в доступе до тех пор, пока dir2/3.gz не будет скопирован, и все будет согласовано; вы можете, например, использовать WatchService для прослушивания изменений, которые происходят во время копирования. Затем вы обработали эти изменения и только закончите операцию после того, как все стабилизируется: все изменения обработаны и X секунд без изменений.
  • копирование только полностью согласованных состояний (то есть не копирование dir1/3.gz, если dir2/3.gz также не копируется). Вы можете сделать это, просмотрев временные метки и не копируя ничего, что было изменено за последние X секунд до начала вашей программы.

Я понимаю, что причина несжатия во временном каталоге перед перемещением в конечный пункт назначения заключается в том, чтобы избежать несогласованных состояний. В противном случае ваша программа будет работать быстрее, если не требуется перемещение (то есть: распаковать непосредственно в целевой каталог).