C# как скачать файл с помощью libcurlnet

Может кто-нибудь показать мне правильный способ загрузки файла с указанным URL-адресом с помощью libcurlnet

FileStream fs = new FileStream("something.mp3", FileMode.Create);
WriteData wd = OnWriteData; 
easy.SetOpt(CURLoption.CURLOPT_URL, downloadFileUrl); 
easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, wd);

if ("CURLE_OK" == easy.Perform().ToString())
{
    //save_file 
}


 static System.Int32 OnWriteData(FileStream stream, byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
    stream.Write(buf, 0, buf.Length);
    return size * nmemb;
} //OnWriteData


public delegate System.Int32
   WriteData(
      FileStream stream, //added parameter
      byte[] buf, Int32 size, Int32 nmemb, Object extraData);

1 ответ

Решение

Вам не нужно объявлять свой собственный обратный вызов для функции WriteFunction, делегат объявлен в Easy, И вам нужно передать делегат опции WriteFunction, а не опции WriteData. Последний предназначен для объекта, который вы хотите передать делегату WriteFunction. Исправление всех этих вещей даст мне следующий рабочий код:

void Main()
{

    Curl.GlobalInit(3);
    var downloadFileUrl ="https://stackru.com/images/0482e4835a0ac970dd51c9389a0c16a2d0364810.png"; 

    using(var easy = new Easy())
    using(FileStream fs = new FileStream(@"something2.png", FileMode.Create))
    {   
        // the delegate points to our method with the same signature
        Easy.WriteFunction wd = OnWriteData; 
        easy.SetOpt(CURLoption.CURLOPT_URL, downloadFileUrl); 
        // we do a GET
        easy.SetOpt(CURLoption.CURLOPT_HTTPGET, 1); 
        // set our delegate
        easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wd);
        // which object we want in extraData
        easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, fs);

        // let's go (notice that this are enums that get returned)
        if (easy.Perform() == CURLcode.CURLE_OK)
        {
          // we can be sure the file is written correctly
          "Success".Dump();
        }
        else 
        {
          "Error".Dump();
        }
    }
}

System.Int32 OnWriteData(byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
    // cast  extraData to the filestream
    var fs = (FileStream) extraData;
    fs.Write(buf, 0, buf.Length);
    return size * nmemb;
} //OnWriteData
Другие вопросы по тегам