Здравствуйте, DmitryT, Вы писали:
DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?
Ещё с Win98 (если не раньше) Microsoft использует для сжатия в своей ОС формат *.cab. Проводник "из коробки" умеет распаковывать такие файлы. Для сжатия из командной строки есть утилита makecab.exe (проверял наличие в XP/Vista/7 — вроде везде "из коробки" есть). Качество сжатия вполне себе на уровне, особенно при использовании алгоритма LZX:
который использует IE для распаковки gzip контента сайтов. Сжатие выполняется по аналогии, однако после обновления IE с 6 до 7 сжатие работать перестало (возвращается "not implemented"), так что на сжатие в gzip пришлось забить и перейти на cab'ы.
Re: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, DmitryT, Вы писали:
DT>Так какой вариант задействован у тебя? DT>Программно?
Смотря где, т.е. в зависимости от возникающих задач. В bat файлах использую консольные утилиты типа makecab.exe
dump_sam.bat (запускается от администратора, позволяет снять дамп локальной базы учётных записей SAM и ключа SYSKEY (при хранении в реестре в ветке SYSTEM) для последующего аудита хэшей на предмет слабых паролей)
В самописной обновлялке просто проверял подпись и использовал 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[5]: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, DmitryT, Вы писали:
DT>Спасибо за обширный ответ.
DT>В моем случае надо в среде С++/МFC постоянно запускать процессы архивирующие создаваемые самой прогой многочисленные и разнообразные логи и ''результаты деятельности''...
Ну тогда проще всего звать консольный 7z.exe с нужными ключами, благо он бесплатный и умеет сжимать в разные форматы (7z, zip, tar.gzip).
Явная программная реализация имеет смысл при необходимости гибкого контроля за процессом сжатия/распаковки (больше чем на уровне запустить/приостановить/прервать — это всё можно и с процессом архиватора провернуть), либо при работе с источниками/приёмниками, не являющимися файлами (сжатие/распаковка в память, потоковая передача сжимаемых/распаковываемых данных по сети без создания промежуточных файлов, etc). Да, вспомнил, что с CAB'ами разбирался по библиотечке с codeproject, с тех пор она шикарно разрослась по возможностям, появилась версия под .NET, возможно пригодится если всё же потребуется "ручная" реализация сжатия.
Re: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, DmitryT, Вы писали:
DT>В проекте для архивирования и разархивирования файлов используется в том числе и ''платный'' winzip32.exe.
DT>Для удешевления проекта в среде Win 7 решили использовать его бесплатные штатные средства Explorerа.
DT>Удалось найти здесь, что
DT>
DT>операции архивирования можно выполнить из командной строки или пакетного файла:
DT>Однократную архивацию здесь предлагают делать при помощи утилиты командной строки Wbadmin.
DT>Но это все не то...
DT>Хотелось бы что-то запустить, по крайней мере, через ShellExecuteEx(...);
DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?
Можно использовать ZipUtils с codeproject.com: архивирует в формате ZIP, исходники есть, лицензия бесплатна в том числе и для коммерческого использования. О впечатлениях писал в блоге у себя... В принципе весьма удобная вещь.
Здравствуйте, 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.
Здравствуйте, De-Bugger, Вы писали:
DB>Здравствуйте, DmitryT, Вы писали:
DT>>Но может есть более ''толковые пути''?
DB>Да, есть. Использовать бесплатные сторонние библиотеки.
Уже сейчас используется бесплатная сторонняя библиотека ZLib.
Но поставлена задача архивирования файлов средствами Win 7...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[4]: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, Аноним, Вы писали:
А>Ещё с Win98 (если не раньше) Microsoft использует для сжатия в своей ОС формат *.cab. Проводник "из коробки" умеет распаковывать такие файлы. Для сжатия из командной строки есть утилита makecab.exe (проверял наличие в XP/Vista/7 — вроде везде "из коробки" есть). Качество сжатия вполне себе на уровне, особенно при использовании алгоритма LZX: А>
А>Для извлечения из командной строки есть утилита extract.exe/extrac32.exe.
А>Программно так же есть API (используется cabinet.dll)
А>Для работы с gzip форматом можно использовать интерфейс IDataFilter
который использует IE для распаковки gzip контента сайтов. Сжатие выполняется по аналогии, однако после обновления IE с 6 до 7 сжатие работать перестало (возвращается "not implemented"), так что на сжатие в gzip пришлось забить и перейти на cab'ы.
А>Ещё с Win98 (если не раньше) Microsoft использует для сжатия в своей ОС формат *.cab. Проводник "из коробки" умеет распаковывать такие файлы. Для сжатия из командной строки есть утилита makecab.exe (проверял наличие в XP/Vista/7 — вроде везде "из коробки" есть). Качество сжатия вполне себе на уровне, особенно при использовании алгоритма LZX: А>
В моем случае надо в среде С++/МFC постоянно запускать процессы архивирующие создаваемые самой прогой многочисленные и разнообразные логи и ''результаты деятельности''...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[6]: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, DmitryT, Вы писали:
DT>>Спасибо за обширный ответ.
DT>>В моем случае надо в среде С++/МFC постоянно запускать процессы архивирующие создаваемые самой прогой многочисленные и разнообразные логи и ''результаты деятельности''...
А>Ну тогда проще всего звать консольный 7z.exe с нужными ключами, благо он бесплатный и умеет сжимать в разные форматы (7z, zip, tar.gzip).
А>Явная программная реализация имеет смысл при необходимости гибкого контроля за процессом сжатия/распаковки (больше чем на уровне запустить/приостановить/прервать — это всё можно и с процессом архиватора провернуть), либо при работе с источниками/приёмниками, не являющимися файлами (сжатие/распаковка в память, потоковая передача сжимаемых/распаковываемых данных по сети без создания промежуточных файлов, etc). Да, вспомнил, что с CAB'ами разбирался по библиотечке с codeproject, с тех пор она шикарно разрослась по возможностям, появилась версия под .NET, возможно пригодится если всё же потребуется "ручная" реализация сжатия.
Я предлагал им 7-zip сразу, но, как выяснили, он не бесплатный для коммерческого использования...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[8]: Доступ к API архивирования файлов средствами Win 7
А>Если я правильно понимаю, то можно использовать 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
Здравствуйте, Carc, Вы писали:
C>Можно использовать ZipUtils с codeproject.com: архивирует в формате ZIP, исходники есть, лицензия бесплатна в том числе и для коммерческого использования. О впечатлениях писал в блоге у себя... В принципе весьма удобная вещь.
C>Может подойдет?
На codeproject я ее видел, но там внизу много отрицательных комментариев...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, DmitryT, Вы писали:
DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?
Зачем средствами Windows 7, можно просто взять minizip.
Хочу также предупредить, что возможности разных zip-программ и библиотек отличаются, поэтому не всегда можно безболезненно заменить упаковщик на другой.
В частности, winzip поддерживает имена файлов в UTF-8, а реализация Win 7 нет, она умеет хранить только имена в текущей неюникодной кодировке. Кроме юникода, стоит обратить внимание на файлы более 4 GB, таймстампы, сохранение секьюрити дескрипторов.
Русский военный корабль идёт ко дну!
Re: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, DmitryT, Вы писали:
DT>Попадались ли кому-то функции доступа (API) архивирования файлов средствами Win 7 ?
Я подозреваю, что т.к. .zip-архив является shell-папкой, заработает через IFileOperation (стоит через него попробовать добавлять в существующий архив, создание нового тогда будет отельной задачей, решаемой через копирование пустышки).
Русский военный корабль идёт ко дну!
Re: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, Alexander G, Вы писали:
AG>Зачем средствами Windows 7, можно просто взять minizip.
AG>Хочу также предупредить, что возможности разных zip-программ и библиотек отличаются, поэтому не всегда можно безболезненно заменить упаковщик на другой. AG>В частности, winzip поддерживает имена файлов в UTF-8, а реализация Win 7 нет, она умеет хранить только имена в текущей неюникодной кодировке. Кроме юникода, стоит обратить внимание на файлы более 4 GB, таймстампы, сохранение секьюрити дескрипторов.
Откуда взять minizip?
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[2]: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, Alexander G, Вы писали:
AG>Я подозреваю, что т.к. .zip-архив является shell-папкой, заработает через IFileOperation (стоит через него попробовать добавлять в существующий архив, создание нового тогда будет отельной задачей, решаемой через копирование пустышки).
Уточни мысль...
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Re[2]: Доступ к API архивирования файлов средствами Win 7
Здравствуйте, DmitryT, Вы писали:
DT>Здравствуйте, Alexander G, Вы писали:
AG>>Я подозреваю, что т.к. .zip-архив является shell-папкой, заработает через IFileOperation (стоит через него попробовать добавлять в существующий архив, создание нового тогда будет отельной задачей, решаемой через копирование пустышки).
DT>Уточни мысль...
Для добавления файлов в архив создать сначала пустой архив любым способом, нпример копированием заготовки.