Я использую 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.
Я делаю это правильно?
Задача ещё не решена.
Других решений пока нет …