2012-11-21 150 views
1

我是libcurl的新手,我试图从服务器上使用ftp获取文件列表,通过这里的例子和其他一些帖子,我已经拿出了下面的代码。但是,当我运行它,它会返回错误信息:为什么这不起作用? libcurl&C++

失败写体(4294967295 = 129!)

由CURLOPT_ERRORBUFFER设置错误字符串

。该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; 
} 

回答

2

4294967295是-1的32位无符号的版本,这可能是你的回调返回,因此libcurl的认为这是一个错误,停止一切。

其中是 - >文件名分配?

你传递一个FILE *,以CURLOPT_WRITEDATA,但回调把它读成一个结构FtpFile * ...

+0

您将FILE *传递给CURLOPT_WRITEDATA,然而您的回调将其作为结构体FtpFile *读取......我做错了。文件名被分配在ftpfile = fopen(fname,“wb”);非常感谢您指出这个问题:) – StudentX

+0

fopen()调用不会指定您的回调函数读取的 - > filename结构成员... –

+0

,这就是我改变回调的原因。 – StudentX

0

首先,你fileWrite函数应该返回的书面字节数。 fwrite返回编号为的对象。所以,你必须return written * size;

然后,是Daniel Stenberg发明指出,要传递一个FILE *fileWrite但使用它作为一个struct FtpFile *。试试这个来代替:

static size_t fileWrite(void *buffer, size_t size, size_t nmemb, void *stream) 
{ 
    size_t written = fwrite(buffer, size, nmemb, (FILE*)stream); 
    std::cout << written * size << std::endl; 
    if(written <= 0) 
    std::cout << "Nothing written : " << written; 
    return written * size; 
} 
+0

我的坏,但仍然没有工作。我忘了在原始文章中提到错误消息后程序崩溃。 – StudentX