Пример #1
0
// ////////////////////////////////////////////////////////////////////////////////
// @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;
}