2012-11-21 58 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