Фоновая архивация файлов в 7zip c копированием их на FTP с проверкой контрольной CRC-суммы архива



Возникла задача сделать обмен РИБ в 8.2 через FTP. Не пытаясь изобрести велосипед, давно уже использую замечательную программу FTPDrive (www.killprog.com). FTPDrive подключает к системе FTP-ресурс как логический диск, на который можно просто копировать информацию. При этом программа имеет множество настроек и позволяет достаточно быстро подключиться к желаемому ресурсу. Не требует инсталяции.
  Все бы ничего но копировать файлы выгрузки без архивации на FTP неразумно, и появилась проблема — штатный архиватор 1С 8.2 не хотел создавать файлы на FTP-ресурсе и копировать их 1С тоже отказывалась. Тогда был использован вызов консольного архиватора 7zip, но начали жаловаться пользователи на часто появляющееся консольное окно.
  Тогда было написано приложение позволяющее в фоновом режиме архивировать файлы в 7zip с добавлением к имени контрольной CRC-суммы архива и последующей проверкой при распаковке с удалением поврежденных в ходе пересылки файлов.

    Возникла задача сделать обмен РИБ в 8.2 через FTP. Не пытаясь изобрести велосипед, давно уже использую замечательную программу FTPDrive (www.killprog.com). FTPDrive подключает к системе FTP-ресурс как логический диск, на который можно просто копировать информацию. При этом программа имеет множество настроек и позволяет достаточно быстро подключиться к желаемому ресурсу. Не требует инсталяции.

   Все бы ничего но копировать файлы выгрузки без архивации на FTP неразумно, и появилась проблема — штатный архиватор 1С 8.2 не хотел создавать файлы на FTP-ресурсе и копировать их 1С тоже отказывалась. Тогда был использован вызов консольного архиватора 7zip, но начали жаловаться пользователи на часто появляющееся консольное окно.

   Вместо FTPDrive можете использовать любую другую программу с похожим функционалом, например: WebDrive (www.webdrive.com), но он платный.

   По сути приложение SevenZipFon.exe занимается архивацией/распаковкой архивов 7zip и копированием в фоновом режиме результатов, что не привязывает его к FTP, т.е. это может быть VPN и что угодно еще (лишь бы можно было указать путь к файлу-источнику и к файлу-получателю ).

   Тогда было написано приложение позволяющее в фоновом режиме архивировать файлы в 7zip (запуск программы SevenZipFon.exe с ключами -a и -e ). В последствии, практика показала, что архивы время от времени приходят поврежденные и чтобы исключить проблемы с их обработкой был добавлен расчет контрольной суммы (CRC) после формирования архива и добавление этой контрольной суммы к имени архива (при запуске программы SevenZipFon.exe с ключем -ac). Соответственно при извлечении файлов из архива с контролем CRC-сумм надо использовать при запуске программы SevenZipFon.exe ключ -ec.

Приложение необходимо запустить с тремя параметрами.

Порядок использования:
  SevenZipFon  [ключ]  [файл-источник]  [файл-получатель]

Список ключей:
  -a  : ключ архивации;
  -e  : ключ распаковки;
  -ac  : ключ архивации с расчетом CRC-суммы и добавлением ее к имени файла (после знака ~);
  -ec  : ключ распаковки с предварительным расчетом CRC-суммы и удалением файла в случае не совпадения;

Примеры :
  SevenZipFon.exe -a «C: est.xls» «Z: est.7z»  — это для архивации файла 

  SevenZipFon.exe -e «Z: est.7z» «C: est.xls» — это для распаковки файла

  SevenZipFon.exe -ac «C: est.xls» «Z: est.7z»  — это для архивации файла с расчетом CRC-суммы и добавлением ее к имени файла (на выходе будет создан файл с именем, н-р: test~122714201.7z, где число 122714201 — это CRC-сумма для файла архива test.7z).

  SevenZipFon.exe -ec «Z: est~122714201.7z» «C:» — это для распаковки с предварительным расчетом CRC-суммы и удалением файла в случае не совпадения.

Как видно из примеров в качестве источника и приемника указываеются полные пути.

Приложение при архивации сначала упаковывает файл во временный каталог, а затем копирует его по указанному пути.

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

При этом в трее отображается на желтом фоне ход процесса в процентах:

— при архивировании — красные цифры и красная индикаторная полоска;
— при копировании полученного архива в указанное место назначения — черные цифры и красная индикаторная полоска;
— при копировании архива из указанного места во временную папку (перед распаковкой) — черные цифры и синяя индикаторная полоска;
— при распаковке архива в указанное место назначения — синие цифры и синяя индикаторная полоска.

SevenZipFon.exe не требует сторонних библиотек, включая библиотеки 7zip.

Пример использования приложения SevenZipFon.exe в 1С 8.2 (конфигурация самописная):

1. В конфигураторе создать общий макет SevenZip и поместить в него файл SevenZipFon.exe

2. Привожу пример функции для извлечения приложения из общего макета SevenZip :

Функция Получить7ZipФоновый() Экспорт
пПапкаДляРобота=СокрЛП(Константы.ПапкаДляФайловРобота.Получить());
Если пПапкаДляРобота="" Тогда
пПапкаДляРобота=СокрЛП(КаталогВременныхФайлов());
КонецЕсли;
Если Лев(пПапкаДляРобота,1)<>"" Тогда
пПапкаДляРобота=пПапкаДляРобота+"";
КонецЕсли;
Результат = "";
Попытка
ZIPexe = пПапкаДляРобота + "SevenZipFon.exe";
Макет = ПолучитьОбщийМакет("SevenZipFon");
Макет.Записать(ZIPexe);
Результат = ZIPexe;
Исключение
Сообщить("Ошибка сохранения файла: SevenZipFon.exe в каталог: " + пПапкаДляРобота, СтатусСообщения.ОченьВажное);
КонецПопытки;
Возврат Результат;
КонецФункции  

 

3. Привожу пример процедуры архивации:

Процедура АрхивироватьФайлВФоне(ппЧтоАрхивируем,ппЧтоПолучаем) Экспорт
ппЧтоПолучаем    = СтрЗаменить(ппЧтоПолучаем,"/","");
ппЧтоПолучаем    = СтрЗаменить(ппЧтоПолучаем,"\","");
ппЧтоАрхивируем = СтрЗаменить(ппЧтоАрхивируем,"\","");
ппЧтоАрхивируем = СтрЗаменить(ппЧтоАрхивируем,"/","");

пПапкаДляРобота=СокрЛП(Константы.ПапкаДляФайловРобота.Получить());
Если пПапкаДляРобота="" Тогда
пПапкаДляРобота=СокрЛП(КаталогВременныхФайлов());
КонецЕсли;
Если Лев(пПапкаДляРобота,1)<>"" Тогда
пПапкаДляРобота=пПапкаДляРобота+"";
КонецЕсли;

Получить7ZipФоновый();
СтрокаЗапуска = пПапкаДляРобота+"SevenZipFon.exe -ac " + """" + ппЧтоАрхивируем + """ """ + ппЧтоПолучаем + """";
ЗапуститьПриложение(СтрокаЗапуска, пПапкаДляРобота, истина);
КонецПроцедуры

4. Привожу пример процедуры распаковки:

Процедура ИзвлечьФайлВФоне(ппЧтоИзвлекаем,ппКудаИзвлекаем) Экспорт
ппЧтоИзвлекаем    = СтрЗаменить(ппЧтоИзвлекаем,"/","");
ппЧтоИзвлекаем    = СтрЗаменить(ппЧтоИзвлекаем,"\","");
ппКудаИзвлекаем = СтрЗаменить(ппКудаИзвлекаем,"\","");
ппКудаИзвлекаем = СтрЗаменить(ппКудаИзвлекаем,"/","");

пПапкаДляРобота=СокрЛП(Константы.ПапкаДляФайловРобота.Получить());
Если пПапкаДляРобота="" Тогда
пПапкаДляРобота=СокрЛП(КаталогВременныхФайлов());
КонецЕсли;
Если Лев(пПапкаДляРобота,1)<>"" Тогда
пПапкаДляРобота=пПапкаДляРобота+"";
КонецЕсли;

Получить7ZipФоновый();
СтрокаЗапуска = пПапкаДляРобота+"SevenZipFon.exe -ec " + """" + ппЧтоИзвлекаем + """ """ + ппКудаИзвлекаем + """";
ЗапуститьПриложение(СтрокаЗапуска, пПапкаДляРобота, истина);
КонецПроцедуры 

  

10 Comments

  1. Diversus

    Единственные минус FTPDriva — не смог настроить вход через прокси 🙁

    Reply
  2. kirillkr

    Неужели в типовых конфигурациях нет обмена через ftp и сжатие с помощью встроенных функций zip?

    Reply
  3. st2009st

    «начали жаловаться пользователи на часто появляющееся консольное окно» параметры запуска настраивать нужно, что бы не появлялось, все это стандартно решаемо и без левых утилит

    Reply
  4. Ivon

    (1). Для этого используй еще одну прогу — httport. она позволяет с любым ресурсом работать через прокси. В настройках указываешь локальный порт, прокси, удаленный адрес, удаленный порт. Для FTP нужно настроить 21 и 20 порты. В FTPDrive указываешь адрес FTP 127.0.0.1. И все будет работать. Так же можно мепить SMTP, POP3 и т.п.

    Reply
  5. Ivon

    (1). Нашел ссылку, подробно расписано http://www.freeproxy.ru/ru/free_proxy/faq/port_mapping_using_httport.htm

    Reply
  6. o2005

    (3). «параметры запуска настраивать нужно, что бы не появлялось, все это стандартно решаемо и без левых утилит»

    Ссылку на описание покажи пожалуйста.

    Reply
  7. o2005

    Консольное окно архиватора 7zip скриптом на vbs не спрячешь

    Reply
  8. vec435

    новый подход-это хорошо. а стандартные?

    ЧтениеZIP=Новый ЧтениеZipФайла

    ЧтениеZIP.ИзвлечьВсе(каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);

    Архив = Новый ЗаписьZIPФайла(«C:» + Выборка.Ссылка + «.zip»,,,МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный);

    Архив.Добавить(«C:price.spr»);

    Архив.Записать();

    ФТП = Новый FTPСоединение(«111.222.1.2», , «user», «passw»);

    МассивФайлов = ФТП.НайтиФайлы(«», «po*.zip»);

    ФТП.Записать(«C:load.flz», «load_» + Выборка.Ссылка+ «.flz»);

    Reply
  9. o2005

    Основная идея предложенного решения это расчет контрольной суммы при формировании архива и добавление его к имени архива. А при расчете контрольной суммы архива при получении происходит удалением некорректных архивов.

    В противном случае, если приходит некорректный архив может происходить сбой архиватора и соответственно остановка обмена.

    То есть предложенное решение предназначено для устранения влияния сбоев при пересылке файлов.

    Кроме того архиватор 7zip обладает, на сегодняшний день, лучшими показателями по сжатию.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *