Показать сообщение отдельно

  #7  
Старый 22.03.2010, 16:23
noneim
Новичок
Регистрация: 28.11.2007
Сообщений: 5
Провел на форуме:
33325

Репутация: 0
По умолчанию

Распаковка gzip (взято отсюда - http://www.rsdn.ru/forum/winapi/2171857.flat.aspx):
Код:

BOOL WINAPI DecompressFile(HANDLE hArchFile, HANDLE hPlainFile)
{
    HRESULT rc;
    IEncodingFilterFactory* pEflt=NULL;
    IDataFilter* pDF=NULL;
    BOOL bOK=TRUE;
    rc = CoCreateInstance( CLSID_StdEncodingFilterFac, NULL, CLSCTX_INPROC_SERVER, IID_IEncodingFilterFactory, (LPVOID *) &pEflt);
        if( FAILED(rc) )
         return FALSE;
    pEflt->GetDefaultFilter(_T("gzip"), _T("text"), &pDF);
    if (pDF)
    {
            BYTE in_buff[32768]; 
        BYTE out_buff[32768];
        DWORD rdd=0;
        DWORD wrt=0;
        LONG proc=0;
        LONG outpt=0;
        __int64 filesize=0;
        __int64 processed=0;
        GetFileSizeEx(hArchFile, (PLARGE_INTEGER)&filesize);
        while (processed<filesize)
        {
            SetFilePointerEx(hArchFile, *((PLARGE_INTEGER)&processed), NULL, FILE_BEGIN);
            ReadFile(hArchFile, in_buff, sizeof(in_buff), &rdd, NULL);
            rc=pDF->DoDecode(0, sizeof(in_buff), in_buff, sizeof(out_buff), out_buff, rdd, &proc, &outpt, 0);
            if (FAILED(rc))
            {
                bOK=FALSE;
                break;
            }
            WriteFile(hPlainFile, out_buff, outpt, &wrt, NULL);
            processed+=proc;
        }
        do
        {
            rc=pDF->DoDecode(0, sizeof(in_buff), in_buff, sizeof(out_buff), out_buff, 0, &proc, &outpt, 0);
            if (FAILED(rc))
            {
                bOK=FALSE;
                break;
            }
            WriteFile(hPlainFile, out_buff, outpt, &wrt, 0);
        }while(outpt>0);
        pDF->Release();
        pEflt->Release();
        return bOK;
    }
    pEflt->Release();
    return FALSE;
}
все работает, проверено
может учитывал лишние \r\n символы?
 
Ответить с цитированием