C从GitHub下载Zip文件

时间:2019-02-19 02:15:29

标签: c curl libcurl

我想下载一个没有zip的GitHub存储库的zip。它只是文件夹和文件。如果我在Web浏览器中导航到该URL,它将下载一个zip;如果我使用wget url,它将下载一个zip,但是执行以下C脚本将不会为我下载一个zip文件。

此脚本为什么不下载zip文件?

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://github.com/miketheknight2016/SXOS_Cheats/archive/master.zip");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_perform(curl);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                    curl_easy_strerror(res));

        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

如果您不告诉curl将下载的文件保存在何处,它将在控制台中将其打印出来。您将看到在控制台中打印出的一个zip文件。

如果希望它将输出保存到文件,则必须创建一个函数,该函数将一堆数据写入文件,并使用CURL_OPT_WRITEFUNCTION和CURL_OPT_WRITEDATA告诉curl使用该函数:

// before main
static size_t write_data_to_file(void *ptr, size_t size, size_t nmemb, void *stream)
{
    return fwrite(ptr, size, nmemb, (FILE *)stream);
}

// in main before curl_easy_perform
FILE *file = fopen("myfile.zip", "wb");
// you should probably check if file is null here - that would mean it failed to open the file
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, file);

// in main after curl_easy_perform
fclose(file);

不要问我这算什么“简单”。