我已经上传了一个压缩文件7-zip选项add to .zip
只包含一个名为text.txt
的文件到这个GitHub repo,我如何可以读取文件text.txt
的内容 * 而不 * 写入磁盘?
我正在使用curl
将zip文件下载到内存中:
#include <curl/curl.h>
static size_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb,
void* userp) {
size_t realsize = size * nmemb;
auto& mem = *static_cast<std::string*>(userp);
mem.append(static_cast<char*>(contents), realsize);
return realsize;
}
std::string Download(const std::string& url)
{
CURL* curl_handle;
CURLcode res;
std::string chunk;
curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &chunk);
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
// added options that may be required
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); // redirects
curl_easy_setopt(curl_handle, CURLOPT_HTTPPROXYTUNNEL, 1L); // corp. proxies etc.
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L); // we want it all
// curl_easy_setopt(curl_handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
res = curl_easy_perform(curl_handle);
if(res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << '\n';
} else {
std::cout << chunk.size() << " bytes retrieved\n";
}
curl_easy_cleanup(curl_handle);
curl_global_cleanup();
return chunk;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::string link = "https://github.com/R3uan3/test/raw/main/text.zip";
auto data = Download(link);
}
在搜索能够解压缩内存上的zip的lib
时,我找到了这个:libzip(欢迎使用任何lib)。
在搜索示例时,我找到了这个answer,但是他正在将一个zip文件从disk
加载到内存中,并阅读它的内容。
如何读取与字符串data
上的curl
一起下载的zip
?
当我在调试器中可视化data
的内容时,它显示PK
,我尝试将其传递给zip *z
,但z
返回null
//Open the ZIP archive
int err = 0;
zip *z = zip_open(data.c_str(), 0, &err);
//Search for the file of given name
const char *name = "text.txt";
struct zip_stat st;
zip_stat_init(&st);
zip_stat(z, name, 0, &st);
//Alloc memory for its uncompressed contents
char *contents = new char[st.size];
//Read the compressed file
zip_file *f = zip_fopen(z, name, 0);
zip_fread(f, contents, st.size);
zip_fclose(f);
1条答案
按热度按时间o3imoua41#
我忽略了问题中关于curl的所有内容,因为我们已经验证了您已经将
zip
文件正确地存储在内存中。我怎么能读到字符串数据上的zip?
由于您将整个zip文件存储在内存中,因此您需要从
chunk.data()
创建一个zip_source
,并使用该zip_source
打开归档文件,然后打开归档文件中的各个文件。以下是如何实现的(没有错误检查-您需要添加错误检查):