Невозможно скопировать файлы на общий диск Windows с использованием протокола libCurl и FILE - PullRequest
0 голосов
/ 18 декабря 2018

Я использую curl-7.62.0, созданный для машины VC17 X64, для разработки утилиты загрузки файлов.Загрузчик файлов загружает файл на сетевой диск.Каталог сборки curl содержит файлы .exe и .dll

Я смог запустить эту команду из оболочки Windows и смог успешно загрузить файл на сетевой диск.

<path_to_curl>\bin\curl --upload-file C:\file.txt file:////<ip_address>/ShareDrive/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1403    0     0  100  1403      0  87687 --:--:-- --:--:-- --:--:-- 87687

Теперь я хочу достичь того же программного результата и пишу свой компонент на C ++.У меня есть функция загрузки, как показано ниже:

int Uploader::upload(const std::string& url) {
    CURLcode res;
    FILE *hd_src;
    struct stat file_info;
    curl_off_t fsize;

    if (stat(LOCAL_FILE, &file_info)) {
        printf("Couldnt open '%s': %s\n", LOCAL_FILE, strerror(errno));
            return -1;
        }
        fsize = (curl_off_t)file_info.st_size;

        printf("Local file size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", fsize);

        hd_src = fopen(LOCAL_FILE, "rb");

        curl_global_init(CURL_GLOBAL_ALL);

        curl_ = curl_easy_init();
        if (curl_) {
        curl_easy_setopt(curl_, CURLOPT_UPLOAD, 1L);

            curl_easy_setopt(curl_, CURLOPT_URL, url.c_str());

            curl_easy_setopt(curl_, CURLOPT_READDATA, hd_src);

            curl_easy_setopt(curl_, CURLOPT_READFUNCTION, read_callback);

            curl_easy_setopt(curl_, CURLOPT_INFILESIZE_LARGE,
                    (curl_off_t)fsize);

            res = curl_easy_perform(curl_);
        }

        fclose(hd_src);
        return 0;
}

И мой обратный вызов находится в глобальной области видимости:

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{

    printf("Called...\n");

    size_t retcode = fread(ptr, size, nmemb, (FILE*)stream);
    printf("*** We read %lld bytes from file\n", retcode);
    return retcode;
}

И мой основной выглядит так:

int main(int argc, char** argv) {
    Uploader uploader;
    uploader.upload("file:////<ip_address>/ShareDrive/");       
}

Элемент управления никогда не переходит к методу обратного вызова вообще, и, следовательно, загрузка никогда не происходит.Поддерживает ли CURL протокол FILE?Я вижу примеры FTPUpload, HTTPupload, но примеров с протоколом FILE в Windows нет.

Я правильно делаю?

...