gpt4 book ai didi

c - 为什么 minizip 不归档大文件(大于 4 GB)

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:40 27 4
gpt4 key购买 nike

我正在尝试使用 Visual Studio 2010 在 Windows 7 64 位上使用 static minizip 库。
主要目标是归档大于 4GB 的文件。
我使用 CMake 2.8 构建 zlib,并链接到我的项目。
它适用于小于 4GB 的文件,但不适用于大于 4GB 的文件。
为什么我在使用 minizip 归档 5GB 文件时遇到问题?
我在构建库阶段错过了什么吗?
这是我所有的步骤、库和项目: https://github.com/koponomarenko/file_compression

真的需要帮助。谢谢。

更新:

“对于大于 4GB 的文件无法正常工作” 表示我的测试程序在此过程中无任何错误地归档了 5GB 的 txt 文件。我检查了所有 5,368,709,120 字节的 zipWriteInFileInZip() 返回 ZIP_OKzipCloseFileInZip()zipClose() 不返回任何错误。但是在创建的存档中(我使用 7-zip)文件信息是:

  • 未压缩大小: 4,294,967,295
  • 压缩大小:8,806,676
  • 属性: 空字段
  • CRC:81970625
  • 方法:放气
  • 主机操作系统:FAT
  • 版本: 45

尝试解压缩(使用 7-zip)此存档时,我收到错误消息“不支持的压缩方法”。

我还使用 7-zip 压缩了相同的 5GB txt 文件。这是此存档中的文件信息:

  • 未压缩大小: 5,368,709,120
  • 压缩大小:9,608,471
  • 属性:A
  • CRC:81970625
  • 方法:放气
  • 主机操作系统:FAT
  • 版本: 45

前 3 个字段与我的存档不同。

更新:

void Archive::create()
{
m_archiveHandle = zipOpen64(m_sName.c_str(), APPEND_STATUS_CREATE);

if ( !m_archiveHandle )
{
throw Error("Can't create the archive. Can be already created.");
}
}

void Archive::add(string sSrcFile, string sDstFile)
{
//////////////////////////// create a file
zip_fileinfo zfi;
memset(&zfi, 0, sizeof(zfi));
int zip64 = 1;
int ret = zipOpenNewFileInZip64(m_archiveHandle,
sDstFile.c_str(),
&zfi,
NULL, 0,
NULL, 0,
"my comment for this interior file",
Z_DEFLATED,
Z_DEFAULT_COMPRESSION,
zip64
);
if ( ret != 0 )
{
throw Error("Can't add file to a zip archive.");
}


//////////////////////////// write to the file
FILE * pFile = fopen( sSrcFile.c_str(), "rb" );
if ( !pFile )
{
throw Error("Can't open target file.");
}

char * buf = new char[BUF_SIZE];
int size_read = 0;
int err;
do
{
err = ZIP_OK;
size_read = (int)fread(buf, 1, BUF_SIZE, pFile);
if (size_read < BUF_SIZE)
if ( feof(pFile) == 0 )
{
err = ZIP_ERRNO;
}

if (size_read > 0)
{
err = zipWriteInFileInZip (m_archiveHandle, buf, size_read);
}
} while ((err == ZIP_OK) && (size_read>0));

delete [] buf;

//////////////////////////// close the file
if ( zipCloseFileInZip(m_archiveHandle) != 0 )
{
throw Error("Can't close added file.");
}
}


void Archive::close()
{
if ( !m_archiveHandle )
return;

if ( zipClose(m_archiveHandle, "my comment for exterior file") != 0)
{
throw Error( "Can't save changes and close." );
}

m_archiveHandle = 0;
}

我使用这个批处理文件来获取静态 Zlib。我将其放入 zlib/build64 并从 “Visual Studio x64 Win64 命令提示符” 运行。

rem ** go to the current script directory
cd %~dp0

cmake .. -G"Visual Studio 10 Win64" -DCMAKE_INSTALL_PREFIX="C:\devel\installed\zlib64"
msbuild /P:Configuration=Debug INSTALL.vcxproj
msbuild /P:Configuration=Release INSTALL.vcxproj

更新:

创建的存档可以通过 Total Commander 和 Windows Explorer 解压缩。我比较了原始文件和解压缩文件的校验和(md5,sha1),它是一样的。但是 Total 和 Explorer 都没有显示压缩文件的属性。同时 7-zip 告诉我“不支持的压缩方法”。

2013 年 12 月 9 日更新:

在 Windows 上处理大于 4GB 的文件时,minizip 似乎有一些属性问题。 7-Zip 和 WinZip 无法解压缩创建的存档。

最佳答案

问题是 ZIP 中中央目录记录的字段顺序(额外字段和文件注释字段)。因此,如果您的文件大于 4GB,并且您为其添加了评论,您将面临此错误。

在我看来,原作者停止维护这个库,但我在 Github 上找到了一个有一些新变化的 repo https://github.com/nmoinvaz/minizip .所以我把这个错误写给了这个 repo 的作者。

关于c - 为什么 minizip 不归档大文件(大于 4 GB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20250022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com