Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2009, 09:40   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию Как сжать и распаковать файл с помощью API?

Приветствую, коллеги. Вопрос таков: как использовать функции сжатия и распаковки через API? Знаю, что в винде есть встроенный архиватор ZIP. Заранее благодарен!
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 10.11.2009, 09:55   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

если хотите использовать встроенные архиваторы, то есть командная строка или батником:
Код:
 C:\PROGRA~1\WinRar\WinRAR a -r -dh -ag_dd_mm_yyyy c:\1.rar *.*
или бесплатный 7z:
Код:
 C:\Program Files\7-Zip\7z a -tzip 1.zip %1\*
 pause
что касается остального, то есть множество компонентов с разными алгоритмами сжатия, поиском ищите ZipTV, VCLZip/Unzip, тощо...


UPD:
как говориться поиск рулит
вот что нашел... распаковка 1.bmp из архива zip.zip средствами zipfldr.dll (код конечно портировать придеться):
Код:
OleInitialize(NULL);

    char cInPath[]="c:\\zip.zip\\1.bmp";
        char cOutPath[]="c:\\newdir";
    int nLen;
    BSTR bstrZip,bstrFol;
    HRESULT hres;
    long lCount;

     IShellDispatch *pSD = NULL;
     //Интерфейсы IID_Folder
     Folder* pZipFolder = NULL;
          Folder* pOutFolder = NULL;
     //Интерфейс IID_FolderItems
     FolderItems* pFolderItems = NULL;

     hres=CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER,IID_IShellDispatch, (LPVOID *) &pSD);
     
     if (SUCCEEDED(hres))
     {
         VARIANT vZipDir,vOutDir,vOptions;
         
         VariantInit(&vZipDir);
         vZipDir.vt = VT_BSTR;
         nLen = (lstrlen(cInPath) + 1) * sizeof(WCHAR);
         bstrZip = SysAllocStringByteLen(NULL,nLen);
         
         MultiByteToWideChar(CP_ACP,0,cInPath,-1,bstrZip,nLen);
         vZipDir.bstrVal = bstrZip;
     
         VariantInit(&vOutDir);
         vOutDir.vt = VT_BSTR;
         nLen = (lstrlen(cOutPath) + 1) * sizeof(WCHAR);
         bstrFol = SysAllocStringByteLen(NULL, nLen);

         MultiByteToWideChar(CP_ACP,0,cOutPath,-1,bstrFol,nLen);
         vOutDir.bstrVal = bstrFol;
         
         if (SUCCEEDED(pSD->NameSpace(vOutDir,&pOutFolder)))
         {   
              //Мы можем получить количество файлов в ZIP папке
              if (SUCCEEDED(pOutFolder->Items(&pFolderItems)))
          {
           pFolderItems->get_Count(&lCount);
          }
             //Опции 
             //4 Do not display a progress dialog box.  
             //8 Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.  
             //16 Respond with "Yes to All" for any dialog box that is displayed.  
             //64 Preserve undo information, if possible. 
             //128 Perform the operation on files only if a wildcard file name (*.*) is specified.  
             //256 Display a progress dialog box but do not show the file names.  
             //512 Do not confirm the creation of a new directory if the operation requires one to be created.  
             //1024 Do not display a user interface if an error occurs.  
             //2048 Version 4.71. Do not copy the security attributes of the file. 
             //4096 Only operate in the local directory. Don't operate recursively into subdirectories. 
             //9182 Version 5.0. Do not copy connected files as a group. Only copy the specified files.

             VariantInit(&vOptions);
             vOptions.vt=VT_I4;
             vOptions.lVal=0;
         
             hres=pOutFolder->CopyHere(vZipDir,vOptions); 

             pOutFolder->Release();
             
             VariantClear(&vOptions);
         }
         
         pSD->Release();

         //SysFreeString(bstrZip);
         VariantClear(&vZipDir);
     
         //SysFreeString(bstrFol);
         VariantClear(&vOutDir);


     }
а вот и запаковка (своего рода вариант копирования в папку... было в MSDN):
Код:
int _tmain(int argc, _TCHAR* argv[]) 
{ 
DWORD strlen = 0; 
char szFrom[] = "C:\\1.txt", 
szTo[] = "C:\\zip.zip"; 
HRESULT hResult; 
IShellDispatch *pISD; 
Folder *pToFolder = NULL; 
VARIANT vDir, vFile, vOpt; 
BSTR strptr1, strptr2; 

CoInitialize(NULL); 

hResult = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, 
IID_IShellDispatch, (void **)&pISD); 

if (SUCCEEDED(hResult)) 
{ 
strlen = MultiByteToWideChar(CP_ACP, 0, szTo, -1, 0, 0); 
strptr1 = SysAllocStringLen(0, strlen); 
MultiByteToWideChar(CP_ACP, 0, szTo, -1, strptr1, strlen); 

VariantInit(&vDir); 
vDir.vt = VT_BSTR; 
vDir.bstrVal = strptr1; 
hResult = pISD->NameSpace(vDir, &pToFolder); 

if (SUCCEEDED(hResult)) 
{ 
strlen = MultiByteToWideChar(CP_ACP, 0, szFrom, -1, 0, 0); 
strptr2 = SysAllocStringLen(0, strlen); 
MultiByteToWideChar(CP_ACP, 0, szFrom, -1, strptr2, strlen); 

VariantInit(&vFile); 
vFile.vt = VT_BSTR; 
vFile.bstrVal = strptr2; 

VariantInit(&vOpt); 
vOpt.vt = VT_I4; 
vOpt.lVal = 4; // Do not display a progress dialog box 

hResult = pToFolder->CopyHere(vFile, vOpt); 

SysFreeString(strptr2); 
pToFolder->Release(); 
} 

SysFreeString(strptr1); 
pISD->Release(); 
} 

CoUninitialize(); 

return 0; 
}
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 10.11.2009 в 10:47.
raxp вне форума Ответить с цитированием
Старый 10.11.2009, 10:01   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Приветствую, коллеги. Вопрос таков: как использовать функции сжатия и распаковки через API? Знаю, что в винде есть встроенный архиватор ZIP. Заранее благодарен!
Тебе нужно во-первых узнать название твоих функций, а во-вторых посмотреть ее интерфейс для Делфи (ну можно поискать в встроенной справке).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.11.2009, 11:06   #4
NioTo
Пользователь
 
Регистрация: 17.12.2007
Сообщений: 32
По умолчанию

Нет функций API для работы с ZIP-архивами, в винде есть библиотеки к которым обращается проводник напрямую: zipfldr.dll и gzip.dll, но врапперов я на них не нашел, т. ч. лучше использовать сторонние библиотеки (врапперы на них) или компоненты. Найти их можно здесь
NioTo вне форума Ответить с цитированием
Старый 11.11.2009, 10:48   #5
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

А к LZMA привязок, часом, нет?
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 11.11.2009, 11:00   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

В setupapi реализована работа с CAB-архивами и LZчётотам.dll должна ещё быть
пыщь
JTG вне форума Ответить с цитированием
Старый 11.11.2009, 16:30   #7
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

библиотеки zipfldr.dll и gzip.dll, говорите. Посмотрим...

а что за setupapi? Можно поподробнее?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 11.11.2009, 16:57   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Setupapi.pas ф-ция SetupIterateCabinet и т.п.
пыщь
JTG вне форума Ответить с цитированием
Старый 12.03.2010, 21:55   #9
Xatr
Форумчанин
 
Аватар для Xatr
 
Регистрация: 17.09.2008
Сообщений: 349
По умолчанию

подниму эту тему, чтобы новую не создавать.

В windows есть такой cabinet.dll. Как было написано в msdn, в нём есть функция Extract, но она оставлена для обраной совместимости.

Как можно с помощью новой функции FCICreate, создать архив в masm32?
если чем помог, поставьте отзыв на весы
Xatr вне форума Ответить с цитированием
Старый 13.03.2010, 10:31   #10
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

http://www.zlib.net/
подпись
liljon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно распаковать файл sanek_sa Общие вопросы Delphi 2 30.01.2012 10:26
Как распаковать pkg файл? Amen Свободное общение 3 08.05.2009 23:35
как распаковать файл. sanek_sa Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 06.11.2008 22:21
сжать файл andrey4623 Общие вопросы Delphi 14 13.01.2008 07:31
Edit .cfg файл с помощью Win32 API klim Win Api 1 26.03.2007 14:52