2017-04-02 172 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