Member 11560490 Ответов: 1

Используется zlib.dll при распаковке файла возникает фатальная ошибка.


Я использовал zlib.dll для распаковки формата excel zip-пакета была вызвана функция "unzReadCurrentFile".

Мой исходный код, как показано ниже:
ZIP_ERR CZipHelperImpl::Uncompress(const char* pSrcFile, const char* pDestPath)
{
	unzFile unzfile = NULL;
	ZIP_ERR errCode = ZIP_OK;
	try
	{
		unzfile = unzOpen64(pSrcFile);
		if (NULL == unzfile)
		{
			throw ZIP_OPEN_SRC_FILE_FAIL;
		}

		unz_global_info64* pstGlobalInfo = new unz_global_info64;
		unz_file_info64* pstFileInfo = new unz_file_info64;

		auto ReleaseResource = [&pstGlobalInfo, &pstFileInfo, &unzfile]() -> void 
		{
			delete pstGlobalInfo;
			delete pstFileInfo;
			unzClose(unzfile);
		};

		try
		{
			if(UNZ_OK != unzGetGlobalInfo64(unzfile, pstGlobalInfo))
			{
				throw ZIP_GET_ZIP_GLOBAL_INFO_FAIL;
			}

			char szZipFileName[256] = {'\0'};
			for (uLong count = 0; count < pstGlobalInfo->number_entry; count++)
			{
				if(UNZ_OK != unzGetCurrentFileInfo64(unzfile, pstFileInfo, szZipFileName, 256, NULL, 0, NULL, 0))
				{
					throw ZIP_GET_ZIP_CUR_FILE_INFO_FAIL;
				}
				std::string archive = std::string(pDestPath) + "\\" + std::string(szZipFileName);
				switch (pstFileInfo->external_fa)//external file attributes
				{
				case FILE_ATTRIBUTE_DIRECTORY:
					{
						CreateDirectory(archive.c_str(), NULL);
					}
					break;
				default:
					{
						if(UNZ_OK != unzOpenCurrentFile(unzfile))
						{
							throw ZIP_OPEN_ZIP_CUR_FILE_FAIL;
						}
						__Unzip2File(unzfile,  archive.c_str());
						if(UNZ_OK != unzCloseCurrentFile(unzfile))
						{
							throw ZIP_CLOSE_ZIP_CUR_FILE_FAIL;
						}
					}
				}
				unzGoToNextFile(unzfile);
			}
			ReleaseResource();
		}
		catch(const ZIP_ERR& err)
		{
			ReleaseResource();
			errCode = err;
		}
	}
	catch(const ZIP_ERR& err)
	{
		errCode = err;
	}
	return errCode;
}


void CZipHelperImpl::__Unzip2File(unzFile unzfile, const char* file)
{
	assert(NULL != unzfile);
	HANDLE hFile = ::CreateFile(
		file,                      //file name
		GENERIC_WRITE,             //access mode
		0,                         //share mode
		NULL,                      //SD
		OPEN_ALWAYS,               //how to create
		FILE_FLAG_WRITE_THROUGH,   //file attributes
		NULL                       //handle to template file
		);
	if (INVALID_HANDLE_VALUE == hFile)
	{
		throw ZIP_CREATE_UNZIP_FILE_FAIL;
	}

	try
	{
		std::string buf(BUFLEN, '\0');
		int len = 0;
		while(true)
		{
			buf.clear();
			buf.resize(BUFLEN, '\0');
			len = unzReadCurrentFile(unzfile, const_cast<char*>(buf.c_str()), BUFLEN);
			if(0 > len)
			{
				throw ZIP_READ_ZIP_FILE_FAIL;
			}
			else if (0 == len)
			{
				break;
			}
			else
			{
				DWORD dwNumOfWrite = 0;
				if(!::WriteFile(hFile, (LPCVOID)buf.c_str(), len, &dwNumOfWrite, NULL))
				{
					throw ZIP_WRITE_UNZIP_FILE_FAIL;
				}
			}
		}
		::CloseHandle(hFile);
	}
	catch(const ZIP_ERR& err)
	{
		::CloseHandle(hFile);
		throw err;
	}
}


не могли бы вы помочь мне проверить эту проблему?

Большое спасибо!

Что я уже пробовал:

Я попытался распаковать txt-формат zip-пакета, но эта операция прошла успешно.

1 Ответов

Рейтинг:
1

OriginalGriff

Какое исключение? Какие данные? Мы не можем получить доступ ни к одному из них, и они оба жизненно важны для решения этой проблемы.
Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!