Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 31.08.11 12:16
Оценка:
В проекте для архивирования и разархивирования файлов используется в том числе и ''платный'' winzip32.exe.

Для удешевления проекта в среде Win 7 решили использовать его бесплатные штатные средства Explorerа.

Удалось найти здесь, что

операции архивирования можно выполнить из командной строки или пакетного файла:

ntbackup backup [systemstate] "@имя_файла_bks" /J {"имя_задания"} [/P {"имя_пула"}] [/G {"идентификатор_guid"}] [/T { "имя_ленты"}] [/N {"носитель"}] [/F {"имя_файла"}] [/D {"описание"}] [/DS {"имя_сервера"}] [/IS {"имя_сервера"}] [/A] [/V:{yes|no}] [/R:{yes|no}] [/L:{f|s|n}] [/M {тип_архива}] [/RS:{yes|no}] [/HC:{on|off}] [/SNAP:{on|off}]


Однократную архивацию здесь предлагают делать при помощи утилиты командной строки Wbadmin.

Но это все не то...

Хотелось бы что-то запустить, по крайней мере, через ShellExecuteEx(...);

Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re: Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 31.08.11 13:27
Оценка:
Один из способов — ''достучаться'' к WindowsBase.DLL.

Как здесь сделали для С#...

Но может есть более ''толковые пути''?
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[2]: Доступ к API архивирования файлов средствами Win 7
От: De-Bugger  
Дата: 31.08.11 13:44
Оценка:
Здравствуйте, DmitryT, Вы писали:

DT>Но может есть более ''толковые пути''?


Да, есть. Использовать бесплатные сторонние библиотеки.
Re[3]: Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 31.08.11 16:21
Оценка:
Здравствуйте, De-Bugger, Вы писали:

DB>Здравствуйте, DmitryT, Вы писали:


DT>>Но может есть более ''толковые пути''?


DB>Да, есть. Использовать бесплатные сторонние библиотеки.


Уже сейчас используется бесплатная сторонняя библиотека ZLib.

Но поставлена задача архивирования файлов средствами Win 7...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[4]: Доступ к API архивирования файлов средствами Win 7
От: _Raz_  
Дата: 31.08.11 16:53
Оценка:
Здравствуйте, DmitryT, Вы писали:

DT>Но поставлена задача архивирования файлов средствами Win 7...

RtlCompressBuffer
... << RSDN@Home 1.2.0 alpha 5 (M6) rev. 1511>>
Re: Доступ к API архивирования файлов средствами Win 7
От: Аноним  
Дата: 31.08.11 19:53
Оценка: 2 (1)
Здравствуйте, DmitryT, Вы писали:

DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?


Ещё с Win98 (если не раньше) Microsoft использует для сжатия в своей ОС формат *.cab. Проводник "из коробки" умеет распаковывать такие файлы. Для сжатия из командной строки есть утилита makecab.exe (проверял наличие в XP/Vista/7 — вроде везде "из коробки" есть). Качество сжатия вполне себе на уровне, особенно при использовании алгоритма LZX:

makecab.exe /D CompressionType=LZX /D CompressionMemory=21 SourceFile DestinationFile

Для извлечения из командной строки есть утилита extract.exe/extrac32.exe.

Программно так же есть API (используется cabinet.dll)

Для работы с gzip форматом можно использовать интерфейс IDataFilter
Автор:
Дата: 19.05.07
который использует IE для распаковки gzip контента сайтов. Сжатие выполняется по аналогии, однако после обновления IE с 6 до 7 сжатие работать перестало (возвращается "not implemented"), так что на сжатие в gzip пришлось забить и перейти на cab'ы.
Re: Доступ к API архивирования файлов средствами Win 7
От: Michael Chelnokov Украина  
Дата: 31.08.11 20:12
Оценка: 1 (1)
Здравствуйте, DmitryT, Вы писали:

DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?


Ничего лучше чем вариации использования CopyHere я не встречал.
IMHO, бесплатные библиотеки рулят в данном случае.
Re[2]: Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 01.09.11 03:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ещё с Win98 (если не раньше) Microsoft использует для сжатия в своей ОС формат *.cab. Проводник "из коробки" умеет распаковывать такие файлы. Для сжатия из командной строки есть утилита makecab.exe (проверял наличие в XP/Vista/7 — вроде везде "из коробки" есть). Качество сжатия вполне себе на уровне, особенно при использовании алгоритма LZX:

А>

А>makecab.exe /D CompressionType=LZX /D CompressionMemory=21 SourceFile DestinationFile

А>Для извлечения из командной строки есть утилита extract.exe/extrac32.exe.

А>Программно так же есть API (используется cabinet.dll)


А>Для работы с gzip форматом можно использовать интерфейс IDataFilter
Автор:
Дата: 19.05.07
который использует IE для распаковки gzip контента сайтов. Сжатие выполняется по аналогии, однако после обновления IE с 6 до 7 сжатие работать перестало (возвращается "not implemented"), так что на сжатие в gzip пришлось забить и перейти на cab'ы.



К cab'ам пока относятся настороженно...

Хотят что-то из из этого...

Это из серии rundll32.exe zipfldr.dll,RouteTheCall %1

С разархивацией все ОК: rundll32.exe zipfldr.dll,RouteTheCall %filename%.

Только архивацию пока сделать никак не получается.
Не хватает флажков, а документацию Microsoft не открывает...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[2]: Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 01.09.11 07:56
Оценка:
А>Ещё с Win98 (если не раньше) Microsoft использует для сжатия в своей ОС формат *.cab. Проводник "из коробки" умеет распаковывать такие файлы. Для сжатия из командной строки есть утилита makecab.exe (проверял наличие в XP/Vista/7 — вроде везде "из коробки" есть). Качество сжатия вполне себе на уровне, особенно при использовании алгоритма LZX:
А>

А>makecab.exe /D CompressionType=LZX /D CompressionMemory=21 SourceFile DestinationFile

А>Для извлечения из командной строки есть утилита extract.exe/extrac32.exe.

А>Программно так же есть API (используется cabinet.dll)


Так какой вариант задействован у тебя?
Программно?
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[3]: Доступ к API архивирования файлов средствами Win 7
От: Аноним  
Дата: 01.09.11 12:50
Оценка: 1 (1)
Здравствуйте, DmitryT, Вы писали:

DT>Так какой вариант задействован у тебя?

DT>Программно?

Смотря где, т.е. в зависимости от возникающих задач. В bat файлах использую консольные утилиты типа makecab.exe

dump_sam.bat (запускается от администратора, позволяет снять дамп локальной базы учётных записей SAM и ключа SYSKEY (при хранении в реестре в ветке SYSTEM) для последующего аудита хэшей на предмет слабых паролей)

@echo off
set WORKDIR=%TEMP%\SAM_DUMP_%RANDOM%
md %WORKDIR%
cd %WORKDIR%
reg save HKLM\SAM "%WORKDIR%\SAM" > NUL
reg save HKLM\SYSTEM "%WORKDIR%\SYSTEM" > NUL
echo .Set DiskDirectory1=%WORKDIR% > "%WORKDIR%\compression.ddf"
echo .Set Cabinet=on >> "%WORKDIR%\compression.ddf"
echo .Set Compression=on >> "%WORKDIR%\compression.ddf"
echo .Set CompressionType=LZX >> "%WORKDIR%\compression.ddf"
echo .Set CompressionMemory=21 >> "%WORKDIR%\compression.ddf"
echo .Set CabinetNameTemplate=CAB.cab >> "%WORKDIR%\compression.ddf"
echo "%WORKDIR%\SAM" >> "%WORKDIR%\compression.ddf"
echo "%WORKDIR%\SYSTEM" >> "%WORKDIR%\compression.ddf"
makecab /F "%WORKDIR%\compression.ddf" > NUL
move "%WORKDIR%\CAB.cab" "%~dp0\%COMPUTERNAME%_%RANDOM%.cab" > NUL
cd "%~dp0"
rd /s /q "%WORKDIR%" > NUL


В самописной обновлялке просто проверял подпись и использовал SetupIterateCabinet для распаковки. В проектах, где есть необходимость сжимать данные в gzip формате — использую zlib, благо при статической линковке размер exe увеличивается копеечно по современным меркам и не приходится таскать с собой dll. Так же в перспективе обновлялку переписать с использованием Delta Compression API, правда не совсем ясны гарантии наличия в системе mspatcha.dll (содержит функции для накладывания разностных пачтей). Для создания патчей необходима mspatchc.dll которой по умолчанию в системе нет, но, учитывая что патчи создает разработчик, это не критично. Ну и в программе где необходимо сжимать/распаковывать данные пользователя используется API FCICreate/FDICreate. Правда API специфическое — по своей логике плотно завязано на работу с файлами, хотя, конечно, можно и написать свои реализации функций, которые будут читать данные из памяти и записывать в память.

Вариант с использованием RtlCompressBuffer/RtlDecompressBuffer не порадовал качеством сжатия (возможно не умею правильно готовить), сгодится скорее для любителей всяких микроскопических утилит, не желаюших связываться с FCICreate/FDICreate. API LZOpenFile/LZRead умеет только распаковывать, функций сжатия не нашёл, что существенно снижает его полезность. C zipfldr32.dll особо не работал, т.к. сталкивался с "самопальными" дистрибутивами WinXP где ей делали regsvr32 /u и удаляли как лишний элемент.

Вообще, наиболее перспективный вариант качественного сжатия/распаковки — прикрутить LZMA API от 7z, но уж больно там всё мудрено, надо разбираться
Re[4]: Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 01.09.11 14:07
Оценка:
Спасибо за обширный ответ.

В моем случае надо в среде С++/МFC постоянно запускать процессы архивирующие создаваемые самой прогой многочисленные и разнообразные логи и ''результаты деятельности''...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[5]: Доступ к API архивирования файлов средствами Win 7
От: Аноним  
Дата: 01.09.11 15:52
Оценка: 1 (1)
Здравствуйте, DmitryT, Вы писали:

DT>Спасибо за обширный ответ.


DT>В моем случае надо в среде С++/МFC постоянно запускать процессы архивирующие создаваемые самой прогой многочисленные и разнообразные логи и ''результаты деятельности''...


Ну тогда проще всего звать консольный 7z.exe с нужными ключами, благо он бесплатный и умеет сжимать в разные форматы (7z, zip, tar.gzip).

Явная программная реализация имеет смысл при необходимости гибкого контроля за процессом сжатия/распаковки (больше чем на уровне запустить/приостановить/прервать — это всё можно и с процессом архиватора провернуть), либо при работе с источниками/приёмниками, не являющимися файлами (сжатие/распаковка в память, потоковая передача сжимаемых/распаковываемых данных по сети без создания промежуточных файлов, etc). Да, вспомнил, что с CAB'ами разбирался по библиотечке с codeproject, с тех пор она шикарно разрослась по возможностям, появилась версия под .NET, возможно пригодится если всё же потребуется "ручная" реализация сжатия.
Re[6]: Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 01.09.11 16:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, DmitryT, Вы писали:


DT>>Спасибо за обширный ответ.


DT>>В моем случае надо в среде С++/МFC постоянно запускать процессы архивирующие создаваемые самой прогой многочисленные и разнообразные логи и ''результаты деятельности''...


А>Ну тогда проще всего звать консольный 7z.exe с нужными ключами, благо он бесплатный и умеет сжимать в разные форматы (7z, zip, tar.gzip).


А>Явная программная реализация имеет смысл при необходимости гибкого контроля за процессом сжатия/распаковки (больше чем на уровне запустить/приостановить/прервать — это всё можно и с процессом архиватора провернуть), либо при работе с источниками/приёмниками, не являющимися файлами (сжатие/распаковка в память, потоковая передача сжимаемых/распаковываемых данных по сети без создания промежуточных файлов, etc). Да, вспомнил, что с CAB'ами разбирался по библиотечке с codeproject, с тех пор она шикарно разрослась по возможностям, появилась версия под .NET, возможно пригодится если всё же потребуется "ручная" реализация сжатия.


Я предлагал им 7-zip сразу, но, как выяснили, он не бесплатный для коммерческого использования...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re: Доступ к API архивирования файлов средствами Win 7
От: Carc Россия http://www.amlpages.com/home.php
Дата: 01.09.11 19:48
Оценка: 1 (1)
Здравствуйте, DmitryT, Вы писали:

DT>В проекте для архивирования и разархивирования файлов используется в том числе и ''платный'' winzip32.exe.


DT>Для удешевления проекта в среде Win 7 решили использовать его бесплатные штатные средства Explorerа.


DT>Удалось найти здесь, что


DT>

DT>операции архивирования можно выполнить из командной строки или пакетного файла:

DT>ntbackup backup [systemstate] "@имя_файла_bks" /J {"имя_задания"} [/P {"имя_пула"}] [/G {"идентификатор_guid"}] [/T { "имя_ленты"}] [/N {"носитель"}] [/F {"имя_файла"}] [/D {"описание"}] [/DS {"имя_сервера"}] [/IS {"имя_сервера"}] [/A] [/V:{yes|no}] [/R:{yes|no}] [/L:{f|s|n}] [/M {тип_архива}] [/RS:{yes|no}] [/HC:{on|off}] [/SNAP:{on|off}]


DT>Однократную архивацию здесь предлагают делать при помощи утилиты командной строки Wbadmin.


DT>Но это все не то...


DT>Хотелось бы что-то запустить, по крайней мере, через ShellExecuteEx(...);


DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?

Можно использовать ZipUtils с codeproject.com: архивирует в формате ZIP, исходники есть, лицензия бесплатна в том числе и для коммерческого использования. О впечатлениях писал в блоге у себя... В принципе весьма удобная вещь.

Может подойдет?
Aml Pages Home
Re[7]: Доступ к API архивирования файлов средствами Win 7
От: Аноним  
Дата: 01.09.11 22:50
Оценка: 1 (1)
Здравствуйте, DmitryT, Вы писали:

DT>Я предлагал им 7-zip сразу, но, как выяснили, он не бесплатный для коммерческого использования...


Да ладно

Can I use the EXE or DLL files from 7-Zip in a Commercial Application?

Yes, but you are required to specify in your documentation (1) that you used parts of the 7-Zip program, (2) that 7-Zip is licensed under the GNU LGPL license and (3) you must give a link to www.7-zip.org, where the source code can be found.


цитата отсюда

Если я правильно понимаю, то можно использовать exe/dll из 7-zip в коммерческом приложении при условиях указания в документации к своей программе:

1) что используются части 7-zip
2) что 7-zip лицензируется по LGPL
3) ссылки на сайт www.7-zip.org где может быть скачан исходный код 7-zip

Это что касаемо легальности использования. Что касаемо бесплатности, то этот момент тоже есть в лицензии:

You can use 7-Zip on any computer, including a computer in a commercial
organization. You don't need to register or pay for 7-Zip.


Я конечно не юрист, но по тексту не вижу необходимости платить если в документации всё честным образом указать. Или я в чём-то ошибаюсь ?
Re[8]: Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 02.09.11 11:45
Оценка:
А>Если я правильно понимаю, то можно использовать exe/dll из 7-zip в коммерческом приложении при условиях указания в документации к своей программе:

А>1) что используются части 7-zip

А>2) что 7-zip лицензируется по LGPL
А>3) ссылки на сайт www.7-zip.org где может быть скачан исходный код 7-zip

А>Это что касаемо легальности использования. Что касаемо бесплатности, то этот момент тоже есть в лицензии:


А>

You can use 7-Zip on any computer, including a computer in a commercial
А> organization. You don't need to register or pay for 7-Zip.


А>Я конечно не юрист, но по тексту не вижу необходимости платить если в документации всё честным образом указать. Или я в чём-то ошибаюсь ?


Я тоже не юрист, но им что-то там не нравится...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[2]: Доступ к API архивирования файлов средствами Win 7
От: DmitryT  
Дата: 02.09.11 11:49
Оценка:
Здравствуйте, Carc, Вы писали:

C>Можно использовать ZipUtils с codeproject.com: архивирует в формате ZIP, исходники есть, лицензия бесплатна в том числе и для коммерческого использования. О впечатлениях писал в блоге у себя... В принципе весьма удобная вещь.


C>Может подойдет?


На codeproject я ее видел, но там внизу много отрицательных комментариев...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re: Доступ к API архивирования файлов средствами Win 7
От: Alexander G Украина  
Дата: 03.09.11 08:20
Оценка:
Здравствуйте, DmitryT, Вы писали:

DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?


Зачем средствами Windows 7, можно просто взять minizip.

Хочу также предупредить, что возможности разных zip-программ и библиотек отличаются, поэтому не всегда можно безболезненно заменить упаковщик на другой.
В частности, winzip поддерживает имена файлов в UTF-8, а реализация Win 7 нет, она умеет хранить только имена в текущей неюникодной кодировке. Кроме юникода, стоит обратить внимание на файлы более 4 GB, таймстампы, сохранение секьюрити дескрипторов.
Русский военный корабль идёт ко дну!
Re: Доступ к API архивирования файлов средствами Win 7
От: Alexander G Украина  
Дата: 03.09.11 08:49
Оценка:
Здравствуйте, DmitryT, Вы писали:

DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?


Я подозреваю, что т.к. .zip-архив является shell-папкой, заработает через IFileOperation (стоит через него попробовать добавлять в существующий архив, создание нового тогда будет отельной задачей, решаемой через копирование пустышки).
Русский военный корабль идёт ко дну!
Re: Доступ к API архивирования файлов средствами Win 7
От: Muxa  
Дата: 03.09.11 08:55
Оценка:
вот здесь
Автор: Muxa
Дата: 28.09.09
пример.
правда на .net
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.