// //////////////////////////////////////////////////////////////////////////////// // @global 释放文件 // void ExtractFile(unzFile& uf) { unz_global_info64 gi; int err = unzGetGlobalInfo64(uf, &gi); if ( UNZ_OK != err ) { DebugTools::OutputDebugPrintfW( L"[ZipTools] [ExtractFile] unzGetGlobalInfo64 Failed.\r\n"); } for (int i = 0 ; i < gi.number_entry; i++) { if ( ExtractSingleFile(uf) != UNZ_OK ) { break; } if ( i + 1 < gi.number_entry ) { err = unzGoToNextFile(uf); if ( err != UNZ_OK ) { DebugTools::OutputDebugPrintfW( L"[ZipTools] [ExtractFile] unzGoToNextFile Failed.\r\n"); break; } } } }
const void* ArchiveReader::GetFileData_ZIP( size_t idx ) { if ( FExtractedFromArchive.count( ( int )idx ) > 0 ) { return FExtractedFromArchive[( int )idx]; } clPtr<MemFileWriter> FOut = CreateMemWriter( "mem_blob", FFileInfos[idx].FSize ); void* DataPtr = NULL; if ( ExtractSingleFile( FRealFileNames[idx], "", NULL, NULL, FOut ) ) { size_t Sz = static_cast<size_t>( FOut->GetFilePos() ); clPtr<Blob> B = FOut->GetContainer(); B->SafeResize( Sz ); const void* BlobPtr = B->GetDataConst(); DataPtr = AllocData( Sz ); ::memcpy( DataPtr, BlobPtr, Sz ); } return DataPtr; }