2017-04-02 265 views
1

我有一个关于这个代码在https://curl.haxx.se/libcurl/c/ftpget.html的libcurl下载文件的大小超过缓冲区大小

在回调函数

static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) 
{ 
    struct FtpFile *out=(struct FtpFile *)stream; 
    if(out && !out->stream) { 
    /* open file for writing */ 
    out->stream=fopen(out->filename, "wb"); 
    if(!out->stream) 
     return -1; /* failure, can't open file to write */ 
    } 
    return fwrite(buffer, size, nmemb, out->stream); 
} 

如果文件大小超过什么缓冲区大小问题?我认为这个函数不会迭代调用,因为它每次都会覆盖文件。有没有解决它的方法?谢谢!

+0

我不明白的问题。什么覆盖什么文件? – melpomene

+0

@melpomene从下面的评论中复制:我的问题是,回调函数的单个调用不能完成加载整个文件,curl是否继续运行(多次调用回调函数)来完成文件下载?对不起,如果问一个非常愚蠢的问题。我不完全理解整个卷曲过程。谢谢! – user3113633

+1

我从来没有用过,但卷曲我敢肯定它会反复调用回调函数。 – melpomene

回答

2

从卷曲documentation

回调函数将在所有 所调用多的数据进行传递,但你不能做任何假设。它可以是一个字节,它 可能是几千。 在curl.h头文件中定义了将 传递给写回调函数的最大主体数据量: CURL_MAX_WRITE_SIZE(通常默认值为16K)。如果CURLOPT_HEADER是 启用,这使得头获得的数据传递给write回调,你 可以得到高达CURL_MAX_HTTP_HEADER传递到 这头字节的数据。这通常意味着100K。

+0

谢谢!我想我的问题是给回调函数的一次调用是无法完成加载整个文件,并卷曲继续运行(调用回调函数多次)来完成文件下载?对不起,如果问一个非常愚蠢的问题。我不完全理解整个卷曲过程。 – user3113633

+0

的_buffer_是传递数据的回调函数,它将接收块 – P0W

+0

如果要写入内存,请参考[这里](https://curl.haxx.se/libcurl/c/getinmemory.html),使它更清楚 – P0W