gifts2017

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

Опубликовал o2005 (o2005) в раздел Администрирование - Архивирование (backup)

Возникла задача сделать обмен РИБ в 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:\test.xls" "Z:\test.7z"  - это для архивации файла 

  SevenZipFon.exe -e "Z:\test.7z" "C:\test.xls" - это для распаковки файла

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

  SevenZipFon.exe -ec "Z:\test~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 " + """" + ппЧтоИзвлекаем + """ """ + ппКудаИзвлекаем + """";
    ЗапуститьПриложение(СтрокаЗапуска, пПапкаДляРобота, истина);
КонецПроцедуры 

  

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
приложение SevenZipFon.exe (новая версия)
.exe 337,50Kb
17.10.12
14
.exe 337,50Kb 14 Скачать
собственно приложение SevenZipFon.exe (старая версия)
.1252091002 359,00Kb
17.10.12
88
.1252091002 359,00Kb 88 Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение

Комментарии

1. Виталий Барилко (Diversus) 07.09.09 10:49
Единственные минус FTPDriva - не смог настроить вход через прокси :(
Конат; +1 Ответить 2
2. Кирилл Краснов (kirillkr) 09.09.09 08:40
Неужели в типовых конфигурациях нет обмена через ftp и сжатие с помощью встроенных функций zip?
Scag; st2009st; +2 Ответить
3. Andrey St (st2009st) 09.09.09 10:13
"начали жаловаться пользователи на часто появляющееся консольное окно" параметры запуска настраивать нужно, что бы не появлялось, все это стандартно решаемо и без левых утилит
4. Ivon (Ivon) 09.09.09 11:14
(1). Для этого используй еще одну прогу - httport. она позволяет с любым ресурсом работать через прокси. В настройках указываешь локальный порт, прокси, удаленный адрес, удаленный порт. Для FTP нужно настроить 21 и 20 порты. В FTPDrive указываешь адрес FTP 127.0.0.1. И все будет работать. Так же можно мепить SMTP, POP3 и т.п.
5. Ivon (Ivon) 09.09.09 11:16
6. o2005 (o2005) 19.09.09 11:07
(3). "параметры запуска настраивать нужно, что бы не появлялось, все это стандартно решаемо и без левых утилит"
Ссылку на описание покажи пожалуйста.
8. o2005 (o2005) 21.09.09 13:02
Консольное окно архиватора 7zip скриптом на vbs не спрячешь
9. Владимир Чаклин (vec435) 07.12.12 10:02
новый подход-это хорошо. а стандартные?
Чтение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");
ybatiaev; cmd_vasec; +2 Ответить
10. o2005 (o2005) 07.12.12 10:33
Основная идея предложенного решения это расчет контрольной суммы при формировании архива и добавление его к имени архива. А при расчете контрольной суммы архива при получении происходит удалением некорректных архивов.
В противном случае, если приходит некорректный архив может происходить сбой архиватора и соответственно остановка обмена.
То есть предложенное решение предназначено для устранения влияния сбоев при пересылке файлов.
Кроме того архиватор 7zip обладает, на сегодняшний день, лучшими показателями по сжатию.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа