首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DownloadFile函数(使用LibCurl)

DownloadFile函数(使用LibCurl)
EN

Code Review用户
提问于 2013-01-25 02:18:30
回答 1查看 3.9K关注 0票数 3

请告诉我这个功能是否正确(我相信它是正确的),有效的,干净的。

要检查的函数:

代码语言:javascript
复制
::CURLcode CURL_DownloadFile( __in ::LPCSTR URL, __in ::LPCSTR Destination )
{
    ::CURL* Curl;
    ::CURLcode Return_CurlCode;
    std::FILE* File;

    if( ( Curl = ::curl_easy_init( ) ) )
    {
        File = std::fopen( Destination, "wb" );

        ::curl_easy_setopt( Curl, CURLOPT_URL, URL );
        ::curl_easy_setopt( Curl, CURLOPT_WRITEFUNCTION, WriteData );
        ::curl_easy_setopt( Curl, CURLOPT_WRITEDATA, File );

        Return_CurlCode = ::curl_easy_perform( Curl );
        std::fclose( File );
    } else { ( Return_CurlCode = CURLE_FAILED_INIT ); }

    return( Return_CurlCode );
};

使用示例:

代码语言:javascript
复制
#include "Global.h"

::CURLcode CURL_DownloadFile( __in ::LPCSTR URL, __in ::LPCSTR Destination );

int main( void )
{
    if( CURL_DownloadFile( "http://stackoverflow.com/", "c:\\users\\xorr\\desktop\\stackoverflow.txt" ) != CURLE_OK )
        std::printf( "An error has occured...\n" );

    std::cin.get( );
    return( EXIT_SUCCESS );
    // Xorr@Hotmail.com
};

size_t WriteData( void *ptr, size_t size, size_t nmemb, std::FILE *stream ) {
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
}

::CURLcode CURL_DownloadFile( __in ::LPCSTR URL, __in ::LPCSTR Destination )
{
    ::CURL* Curl;
    ::CURLcode Return_CurlCode;
    std::FILE* File;

    if( ( Curl = ::curl_easy_init( ) ) )
    {
        File = std::fopen( Destination, "wb" );

        ::curl_easy_setopt( Curl, CURLOPT_URL, URL );
        ::curl_easy_setopt( Curl, CURLOPT_WRITEFUNCTION, WriteData );
        ::curl_easy_setopt( Curl, CURLOPT_WRITEDATA, File );

        Return_CurlCode = ::curl_easy_perform( Curl );
        std::fclose( File );
    } else { ( Return_CurlCode = CURLE_FAILED_INIT ); }

    return( Return_CurlCode );
};
EN

回答 1

Code Review用户

发布于 2013-01-25 10:48:44

您的写函数不正确:

代码语言:javascript
复制
size_t WriteData( void *ptr, size_t size, size_t nmemb, std::FILE *stream ) {
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
}

如果不返回size*nmemb,CURL将中止传输。因此,您需要注意确保您确实编写了所提供的所有数据。

这也是默认CURLOPT_WRITEFUNCTION的操作,因此不需要编写您自己的版本。

不检查文件指针是否为空

代码语言:javascript
复制
    File = std::fopen( Destination, "wb" );

这是一个C函数(即使您从C++中使用了它)。这意味着您必须检查返回值,以确保该派别成功。

不要人为地停止应用程序。您可能忘记删除这个,然后它将使程序看起来像它是坏的。

代码语言:javascript
复制
std::cin.get( );

如果您从命令行运行,则不需要它。如果在IDE中运行,请设置IDE,使其在应用程序完成时不会关闭输出窗口。

如果你的程序总是成功。然后,我不希望从main()返回一个退出值。这一特殊情况下的编译器将为您安装一个return 0;以表示成功。这是一个很好的指示,说明您已经设计了您的应用程序,使其永远不会失败。

代码语言:javascript
复制
return( EXIT_SUCCESS );

只有在有可能出现故障的情况下,我才返回一个值,并且我希望能够指示可能的失败状态。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/20886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档