我在内存中创建了一个存档,为了测试,我将其写入磁盘以检查它是否未损坏,它打开时没有错误,您可以看到 file.txt 的大小与真实大小相对应,但是当我打开文件时尽管数据已写入,.txt 错误表明存档已损坏,你能帮我吗?
#include <minizip/unzip.h>
#include <minizip/zip.h>
// Callbacks for minizip to work with memory
voidpf open_memory(voidpf opaque, const char* filename, int mode) {
return opaque;
}
uLong write_memory(voidpf opaque, voidpf stream, const void* buf, uLong size) {
auto memory = static_cast<std::vector<char>*>(opaque);
const char* start = reinterpret_cast<const char*>(buf);
memory->insert(memory->end(), start, start + size);
return size;
}
long tell_memory(voidpf opaque, voidpf stream) {
auto memory = static_cast<std::vector<char>*>(opaque);
return memory->size();
}
long seek_memory(voidpf opaque, voidpf stream, uLong offset, int origin) {
return 0; // We don't really need this for our example
}
int close_memory(voidpf opaque, voidpf stream) {
return 0;
}
int testerror_memory(voidpf opaque, voidpf stream) {
return 0;
}
int main()
{
const char* myData = "This is data for my custom file.";
uLong myDataLength = strlen(myData);
std::vector<char> memoryBuffer;
// Set up the minizip functions to write to our memory buffer
zlib_filefunc_def funcs;
funcs.zopen_file = open_memory;
funcs.zwrite_file = write_memory;
funcs.ztell_file = tell_memory;
funcs.zseek_file = seek_memory;
funcs.zclose_file = close_memory;
funcs.zerror_file = testerror_memory;
funcs.opaque = &memoryBuffer;
zipFile zip = zipOpen2(nullptr, APPEND_STATUS_CREATE, nullptr, &funcs);
if (zip) {
zip_fileinfo zipfi = { 0 };
zipOpenNewFileInZip(zip, "file.txt", &zipfi, nullptr, 0, nullptr, 0, nullptr, Z_DEFLATED, Z_DEFAULT_COMPRESSION);
zipWriteInFileInZip(zip, myData, myDataLength);
zipCloseFileInZip(zip);
zipClose(zip, nullptr);
std::cout << "ZIP archive has been created in memory." << std::endl;
}
std::ofstream out("memoryArchive.zip", std::ios::binary);
if (out) {
out.write(memoryBuffer.data(), memoryBuffer.size());
out.close();
std::cout << "ZIP archive has been saved to disk." << std::endl;
}
else {
std::cerr << "Failed to save the ZIP archive to disk." << std::endl;
}
}
我只能到达存档打开且没有错误的阶段,并且数据已写入,但显然某处有中断并且写入不正确。
你的
*_memory
功能看起来全错了。首先,插入向量与写入文件不同。当您写入文件中的某个位置时,您就是“覆盖”那里的内容。不将现有数据推送到文件中。
我不知道为什么你认为你不需要seek
。您的 tell
操作应该告诉您当前文件指针在哪里,而不是文件的大小。
可能还有其他问题,但这些是我首先遇到的问题。7-zip
警告:有效负载数据结束后有一些数据
zip_fileinfo zipfi;
memset(&zipfi, 0, sizeof(zip_fileinfo));
SYSTEMTIME st;
GetSystemTime(&st);
tm t;
t.tm_sec = st.wSecond;
t.tm_min = st.wMinute;
t.tm_hour = st.wHour;
t.tm_mday = st.wDay;
t.tm_mon = st.wMonth - 1; // tm_mon is 0-based
t.tm_year = st.wYear - 1900; // tm_year is years since 1900
t.tm_isdst = -1; //
zipfi.dosDate = tm_to_dosdate(t);
不工作