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!
-
ich meine: : http://www.scherfgen-software.net/
-
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