我是libcurl的新手,我試圖從服務器上使用ftp獲取文件列表,通過這裏的例子和其他一些帖子,我已經拿出了下面的代碼。但是,當我運行它,它會返回錯誤信息:爲什麼這不起作用? libcurl&C++
由CURLOPT_ERRORBUFFER設置錯誤字符串失敗寫體(4294967295 = 129!)
。該curl_easy_strerror(res)
回報:
未能寫入接收數據到磁盤/應用
struct FtpFile
{
const char *filename;
FILE *stream;
};
static size_t fileWrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct FtpFile *out=(struct FtpFile *)stream;
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb");
if(!out->stream)
{
cout << out->filename << " open failure [fileWrite] " << endl;
return -1;
}
}
size_t written = fwrite(buffer, size, nmemb, out->stream);
cout << written << endl;
if(written <= 0)
cout << "Nothing written : " << written;
return written;
}
void getFileList(const char* url, const char* fname)
{
CURL *curl;
CURLcode res;
FILE *ftpfile;
const char *errmsg;
ftpfile = fopen(fname, "wb");
if (ftpfile == NULL)
{
cout << fname << " open failure [getFileList] " << endl ;
return;
}
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fileWrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errmsg);
curl_easy_setopt(curl, CURLOPT_USERNAME, "username");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "password");
curl_easy_setopt(curl, CURLOPT_FTPLISTONLY,TRUE);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\nError Message: %s\n", curl_easy_strerror(res), errmsg);
}
curl_easy_cleanup(curl);
}
fclose(ftpfile);
}
int main(int argc, char *argv[])
{
getFileList("ftp://ftp.example.com/public/somefolder/", "file-list.txt");
system("PAUSE");
return EXIT_SUCCESS;
}
您將FILE *傳遞給CURLOPT_WRITEDATA,然而您的回調將其作爲結構體FtpFile *讀取......我做錯了。文件名被分配在ftpfile = fopen(fname,「wb」);非常感謝您指出這個問題:) – StudentX
fopen()調用不會指定您的回調函數讀取的 - > filename結構成員... –
,這就是我改變回調的原因。 – StudentX