我正在使用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);
}
答案 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'
。