1

私はlibcurlを初めて使用し、ftpを使用してサーバーからファイルリストを取得しようとしています。ここで例やその他の投稿を確認すると、次のコードが思い浮かびます。しかし、実行すると、エラーメッセージが返されます。

本文の書き込みに失敗しました(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;
}
4

2 に答える 2

2

4294967295は、32ビットの符号なしバージョンの-1です。これは、おそらくコールバックが返したものであるため、libcurlはそれをエラーと見なし、すべてを停止しました。

->ファイル名はどこに割り当てられますか?

FILE *をCURLOPT_WRITEDATAに渡しますが、コールバックはそれをstruct FtpFile*..として読み取ります。

于 2012-11-21T19:14:11.107 に答える
0

まず、関数は書き込まれたバイトfileWrite数を返す必要があります。書き込まれたオブジェクトの数を返します。だからあなたはしなければならないfwritereturn 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;
}
于 2012-11-21T17:07:58.403 に答える