(Rund um die...) Zip-Dateien laden



  • hallo,

    ich will bestimmte Dateien aus einem Zip-Archiv einladen. Dafür habe ich jetzt folgende Funktion, die die zlib verwendet:

    void *CUnzip::LoadObject(const string ZipName,const string ObjectName,int *size)
    {
        ifstream    instream;
        char FileName[256];
        string  strFileName;
        SZipHeader  ZipHeader;
    
        instream.open(ZipName.c_str(),ios_base::in|ios_base::binary);
        if(!instream)
            return NULL;
    
        cout<<"Lade Daten ein...\n";
    
        while(true)
        {
            strFileName.erase(strFileName.begin(),strFileName.end());
    
            if(instream.eof())
            {
                instream.close();
                return NULL;
            }
    
            instream.read((char*)&ZipHeader,sizeof(SZipHeader));
            if(!instream.good())
                return NULL;
            if(instream.eof())
            {
                instream.close();
                return NULL;
            }
    
            cout<<"ZipHeader eingelesen\n";
            cout<<ZipHeader.Signature<<"\n";
            cout<<ZipHeader.VersionNeeded<<"\n";
            cout<<ZipHeader.GeneralPurpose<<"\n";
            cout<<ZipHeader.CompressionMethod<<"\n";
            cout<<ZipHeader.LastModTime<<"\n";
            cout<<ZipHeader.LastModDate<<"\n";
            cout<<ZipHeader.CRC32<<"\n";
            cout<<ZipHeader.CompressedSize<<"\n";
            cout<<ZipHeader.UncompressedSize<<"\n";
            cout<<ZipHeader.FilenameLength<<"\n";
            cout<<ZipHeader.ExtraLength<<"\n";
    
            ZeroMemory(FileName, 256);
            instream.read((char*)&FileName,ZipHeader.FilenameLength);
            strFileName=FileName;
    
            cout<<FileName<<"\n";
            cout<<strFileName<<"\n";
    
            instream.seekg(ZipHeader.ExtraLength,ios::cur);
    
            if(strFileName==ObjectName)     
            {
                cout<<"File gefunden!\n";
                if(ZipHeader.Signature != 0x04034B50 ||
                   ZipHeader.GeneralPurpose & 0x0001)
                {
                    instream.close();
                    return NULL;
                }
    
                if(ZipHeader.CompressionMethod!=0)
                {
                    z_stream stream;
    
                    unsigned char* CompressedData = new unsigned char[ZipHeader.CompressedSize];
                    unsigned char* UnCompressedData = new unsigned char[ZipHeader.UncompressedSize];
                    instream.read((char*)CompressedData,ZipHeader.CompressedSize);  
                    stream.next_in=CompressedData;
                    stream.avail_in=ZipHeader.CompressedSize;
    
                    stream.next_out=UnCompressedData;
                    stream.avail_out=ZipHeader.UncompressedSize;                
    
                    stream.zalloc=Z_NULL;
                    stream.zfree=Z_NULL;
    
                    if(inflateInit(&stream)!=Z_OK)
                        cout<<"inflateInit!=Z_OK\n";
                    else
                        cout<<"inflateInit==Z_OK!\n";
                    if(inflate (&stream,Z_FINISH)!=Z_STREAM_END)
                        cout<<"inflate!=Z_STREAM_END\n";
                    else
                        cout<<"inflate==Z_STREAM_END\n";
                    inflateEnd (&stream);
    
                    delete[] CompressedData;
                    *size=ZipHeader.UncompressedSize;
                    return UnCompressedData;
                }
                else
                {
                    cout<<"File entspricht\n";
                    break;
                }
            }
    
            instream.seekg( ZipHeader.CompressedSize
                  + (ZipHeader.GeneralPurpose & 0x0008) ? 12 : 0,ios::cur);     
        }
    
        char* Data = new char[ZipHeader.CompressedSize];
    
        instream.read((char*)Data,ZipHeader.CompressedSize);    
    
        instream.close();
    
        *size = ZipHeader.CompressedSize;
    
        return Data;
    

    Aber wenn ich inflate aufrufe bekomme ich als Fehlermeldung Z_DATA_ERROR zurück!
    Warum?



  • Hehe, kann's sein, dass Du das aus meinem Tutorial hast? 😉 Woher hast Du denn diese inflate-Funktionen?



  • schregen-software?
    Ja, daher hab ich das! 😉
    Wollte es um das dekomprimieren erweitern. Die inflate-Funktion habe ich aus der zlib!





  • Ist inflate/deflate nicht nur eine einzige Kompressionsmethode? Soweit ich weiß, beherrscht das Zip-Format doch mehrere. Vielleicht ist das Objekt eben nicht damit komprimiert, sondern mit einem anderen Algorithmus...



  • kennt jemand vielleicht ein Forum, das sich speziell mit der ZLib beschäftigt?
    Also ich dachte schon, dass man diese Funktionen dafür verwenden kann.



  • thread verschoben ins Rund um die Programmierung Forum. Rund um die Programmierung


Anmelden zum Antworten