CURL在C ++中下载的文件无法打开

时间:2018-12-20 16:34:19

标签: c++ curl visual-c++ visual-studio-2017

我正在使用C++中的程序,必须在其中使用cURL下载文件,然后进一步打开它,但是问题是当我尝试在下载后打开文件时,它没有打开。我正在尝试打开.exe文件。这是代码部分,负责文件下载

curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename.c_str(), "w");
        curl_easy_setopt(curl, CURLOPT_URL, links[index]);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    }

以及打开下载文件的行:

ShellExecute(NULL, "open", fileToLaunch.c_str() , NULL, NULL, SW_HIDE);

当我尝试手动启动文件(通过单击文件)时,Windows向我返回一条错误消息,提示相应的应用程序不是Win32应用程序。我正在使用Visual Studio 2017

这是全部代码:

#include <stdio.h>
#include <curl/curl.h>
#include <curl/easy.h>
#include <string>
#include <iostream>
using namespace std;

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    string url = "Here goes the url for file download";
    string outfilename = "C:\\1.exe";
    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename.c_str(), "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;

    ShellExecute(NULL, "open", outfilename.c_str(), NULL, NULL, SW_HIDE);
}

2 个答案:

答案 0 :(得分:3)

更改

fp = fopen(outfilename.c_str(), "w");

fp = fopen(outfilename.c_str(), "wb");

默认情况下,您将其作为带有换行符翻译的文本写入磁盘。您需要将其编写为二进制文件。

有关更完整的说明,请参见https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-wfopen?view=vs-2017

答案 1 :(得分:2)

首先应删除此行:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

因为write_data函数具有与cURL的CURLOPT_WRITEDATA相同的功能,所以应该删除的那一行下面的行就足够了;其次,在{{1} }首先被满足:

curl_easy_setopt()

您应该将curl_easy_setopt(curl, CURLOPT_URL, url); 参数添加到url,所以它将看起来像这样:

.c_str()

因为此功能无法处理字符串类型的数据...

正如curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); 所述,由于要使用二进制数据流,因此必须在Rob K函数中将'w'更改为'wb'