crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

flankerr
  опции профиля:
сообщение 9.10.2009, 10:13
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Есть некий набор данных который создаёт программа. Надо их опяттаки программно сжать в ZIP и сохранить. Разумеется хочется чтоб была возможность следить за процеесом для возможности информировать сколько осталось время до конца сжатия. Всякие вызовы сторонних EXE отметаються сразу. Ну и кросплатформенность ни кто не отменял.
Может кто в курсе как это организовать ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
filinGUI
  опции профиля:
сообщение 12.10.2009, 14:11
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 12.10.2009
Пользователь №: 1152

Спасибо сказали: 0 раз(а)




Репутация:   0  


flankerr

Архивирование с вложенными каталогами и отображением прогресса можно сделать, используя Info-ZIP. Архив получается вполне стандартный и распакуется везде. Надо только собрать zip и unzip как dll и написать callback-функцию для отображения прогресса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 12.10.2009, 14:30
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(filinGUI @ 12.10.2009, 15:11) *
flankerr

Архивирование с вложенными каталогами и отображением прогресса можно сделать, используя Info-ZIP. Архив получается вполне стандартный и распакуется везде. Надо только собрать zip и unzip как dll и написать callback-функцию для отображения прогресса.


Найти бы еще пример как это делать. Мои копания примеров этой утилиты привели только к одному заключению - функций типа createZip()/Unzip() нет. Т.е. нужно делать какие-то подготовительные телодвижения, логика которых не становится понятной глядя на код.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
filinGUI
  опции профиля:
сообщение 12.10.2009, 15:11
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 12.10.2009
Пользователь №: 1152

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 12.10.2009, 15:30) *
Найти бы еще пример как это делать. Мои копания примеров этой утилиты привели только к одному заключению - функций типа createZip()/Unzip() нет. Т.е. нужно делать какие-то подготовительные телодвижения, логика которых не становится понятной глядя на код.


Таких простых функций действительно нет, для упаковки используется последовательность вызовов ZpInit / ZpSetOptions / ZpArchive, для распаковки вызывается Wiz_SingleEntryUnzip. Для своего проекта я написал функцию SimpleUnzip (Qt3, библиотека Unzip.dll загружается динамически)
Раскрывающийся текст
//---------------------------------------------------------------------------
//  Служебные функции для SimpleUnzip
//---------------------------------------------------------------------------
int WINAPI DummyPrint(LPSTR, unsigned long) {return 0;}
int WINAPI DummyReplace(LPSTR) {return 0;}
int WINAPI DummyPassword(LPSTR, int, LPCSTR, LPCSTR) {return 0;}
void WINAPI DummyMessage(unsigned long, unsigned long, unsigned,
    unsigned, unsigned, unsigned, unsigned, unsigned,
    char, LPSTR, LPSTR, unsigned long, char) {}

//---------------------------------------------------------------------------
//  Распаковывает zip-архив a_zip в каталог a_dir, заменяя существующие файлы
//---------------------------------------------------------------------------
typedef int (WINAPI * FSINGLEENTRYUNZIP)( int, char **, int, char **,
                                          LPDCL, LPUSERFUNCTIONS );
bool SimpleUnzip( const QString& a_zip, const QString& a_dir )
{
    const QString noZip = ru( "Обработка архивов zip невозможна." );
    const QString errCap = ru("Ошибка");
    const TCHAR* UNZ_DLL_NAME = TEXT("unzip32.dll");
    TCHAR szFullPath[_MAX_PATH];
    TCHAR* ptr;
    if ( SearchPathW( 0, UNZ_DLL_NAME, 0,
                      sizeof(szFullPath) / sizeof(szFullPath[ 0 ]),
                      szFullPath, &ptr ) == 0 )
    {
        mbE( errCap, ru("Не найдена библиотека unzip32.dll.\n" + noZip ) );
        return false;
    }

    HMODULE hUnzipDll = LoadLibraryW( UNZ_DLL_NAME );
    if ( hUnzipDll == 0 )
    {
        mbE( errCap, ru("Не удалось загрузить библиотеку unzip32.dll.\n" + noZip ) );
        return false;
    }

    FSINGLEENTRYUNZIP pWiz_SingleEntryUnzip = (FSINGLEENTRYUNZIP)GetProcAddress(
        hUnzipDll, "Wiz_SingleEntryUnzip" );
    if ( pWiz_SingleEntryUnzip == 0 )
    {
        FreeLibrary( hUnzipDll );
        mbE( errCap, ru("Неправильная библиотека unzip32.dll.\n" + noZip ) );
        return false;
    }

    LPDCL lpDCL = new DCL;
    LPUSERFUNCTIONS lpUserFunctions = new USERFUNCTIONS;

    lpUserFunctions->password = DummyPassword;
    lpUserFunctions->print = DummyPrint;
    lpUserFunctions->replace = DummyReplace;
    lpUserFunctions->SendApplicationMessage = DummyMessage;
    lpUserFunctions->sound = 0;
    lpUserFunctions->ServCallBk = 0;

    //set up the flags to be passed into the dll.
    lpDCL->ExtractOnlyNewer = 0;  // Do not extract only newer
    lpDCL->SpaceToUnderscore = 0;
    lpDCL->PromptToOverwrite = 0; // "Overwrite all" selected, no query mode
    lpDCL->fQuiet = 2; // 0 = all messages, 1 = fewer messages, 2 = no messages
    lpDCL->ncflag = 0; // Write to stdout if true
    lpDCL->ntflag = 0; // Do not test zip file
    lpDCL->nvflag = 0; // Do not give a verbose listing
    lpDCL->nfflag = 0; // Do not freshen existing files only
    lpDCL->nzflag = 0; // display a zip file comment if true
    lpDCL->ndflag = 1; // Recreate directories != 0, skip "../" if < 2
    lpDCL->noflag = 1; // Over-write all files
    lpDCL->naflag = 0; // Do not convert CR to CRLF
    lpDCL->nZIflag = 0;// Do not get ZipInfo
    lpDCL->C_flag = 1; // Do not be case insensitive
    lpDCL->fPrivilege = 0;  // 1 => restore ACLs in user mode,
                        // 2 => try to use privileges for restoring ACLs

    QCString zip = a_zip.local8Bit();
    QCString dir = a_dir.local8Bit();
    lpDCL->lpszZipFN = const_cast<CHAR*>(static_cast<const char*>(zip));
    if ( a_dir.isEmpty() )
        lpDCL->lpszExtractDir = 0;
    else
        lpDCL->lpszExtractDir = const_cast<CHAR*>(static_cast<const char*>(dir));

//    qDebug( "zip=%s, dir=%s", lpDCL->lpszZipFN, lpDCL->lpszExtractDir );
    int res = pWiz_SingleEntryUnzip( 0, 0, 0, 0, lpDCL, lpUserFunctions );
//    qDebug( "unzip retcode=%d", res );
    bool rc = res == 0;

    delete lpDCL;
    delete lpUserFunctions;
    FreeLibrary( hUnzipDll );

    return rc;
}


Могу дать ещё пример SimpleZip для упаковки, но только на Delphi
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- flankerr   ZIP архив создать программно как ?   9.10.2009, 10:13
- - Litkevich Yuriy   помоему на прогорге это обширно обсуждалось. Можно...   9.10.2009, 11:01
- - sploid   у тролей есть zlib как 3rdparty src/3rdparty/zlib...   9.10.2009, 12:11
- - flankerr   Если как сжать набор байт стало относительно понят...   9.10.2009, 12:34
- - kwisp   flankerr, что ни одно из предоложенных решений Юр...   9.10.2009, 13:53
- - Litkevich Yuriy   Цитата(kwisp @ 9.10.2009, 17:53) что ни о...   9.10.2009, 15:52
- - flankerr   kwisp, QuaZIP Zlib qCompress жмут поток т.е. пап...   9.10.2009, 16:20
- - Litkevich Yuriy   flankerr, видимо у тебя один выход - заниматся рас...   9.10.2009, 16:36
|- - SABROG   Цитата(Litkevich Yuriy @ 9.10.2009, 17:36...   9.10.2009, 17:11
- - Litkevich Yuriy   Однако исодники у них открыты, или я ошибаюсь?   9.10.2009, 18:28
|- - SABROG   Цитата(Litkevich Yuriy @ 9.10.2009, 19:28...   9.10.2009, 23:39
- - BRE   Можно посмотреть решение в KDE. Там правда все сде...   11.10.2009, 12:25
- - Litkevich Yuriy   в KDE в большенстве случаев индикатор выполнения б...   11.10.2009, 12:33
|- - BRE   Цитата(Litkevich Yuriy @ 11.10.2009, 13:3...   11.10.2009, 12:46
- - kuzulis   А почему автору нельзя использовать сторонние архи...   12.10.2009, 8:13
- - kwisp   kuzulis, первый пост об этом говорит.   12.10.2009, 8:23
- - filinGUI   flankerr Архивирование с вложенными каталогами и ...   12.10.2009, 14:11
|- - SABROG   Цитата(filinGUI @ 12.10.2009, 15:11) flan...   12.10.2009, 14:30
|- - filinGUI   Цитата(SABROG @ 12.10.2009, 15:30) Найти ...   12.10.2009, 15:11
- - SABROG   Плохо это решение тем, что оно не переносимо, ибо ...   12.10.2009, 15:19


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 17.7.2025, 19:23