在内存中创建存档c++

问题描述 投票:0回答:2

我在内存中创建了一个存档,为了测试,我将其写入磁盘以检查它是否未损坏,它打开时没有错误,您可以看到 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;
    }
}

我只能到达存档打开且没有错误的阶段,并且数据已写入,但显然某处有中断并且写入不正确。

c++ zlib minizip
2个回答
0
投票

你的

*_memory
功能看起来全错了。首先,插入向量与写入文件不同。当您写入文件中的某个位置时,您就是“覆盖”那里的内容。不将现有数据推送到文件中。 我不知道为什么你认为你不需要seek。您的

tell

操作应该告诉您当前文件指针在哪里,而不是文件的大小。

可能还有其他问题,但这些是我首先遇到的问题。
    

7-zip


0
投票

警告:有效负载数据结束后有一些数据

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);

不工作

© www.soinside.com 2019 - 2024. All rights reserved.