Файл, загруженный CURL в C ++, не может быть открыт - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю над программой в 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 голосов
/ 22 декабря 2018

Прежде всего, эта строка должна быть удалена:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

, потому что функция write_data имеет те же функции, что и CURLOPT_WRITEDATA cURL, и поэтому строка под той, которая должна быть удалена, будетхватит, а во-вторых, в строке, где впервые встречается 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' в fopen() функции,потому что вы работаете с двоичным потоком данных.

0 голосов
/ 20 декабря 2018

Изменить

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.

...