我是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