C#下載文件

在C#編程中,下載文件是一種常見的任務。下載文件可以是從互聯網上獲取文件或從本地服務器上獲取文件。無論使用哪種方法,我們都需要了解如何在C#代碼中下載文件。以下是一個包含多種下載方法的詳細討論。

一、使用WebClient類進行下載

WebClient是一個用於發送數據的簡單類,在C#編程中經常用於下載和上傳文件。使用WebClient類下載文件非常簡單,只需以下幾步:

1. 引用System.Net命名空間。

2. 創建一個WebClient對象。

3. 調用DownloadFile方法,並提供要下載的文件的URL和本地文件的路徑。

下面是一個示例代碼:

using System.Net;

class Program
{
    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        string url = "http://example.com/image.jpg";
        string localPath = @"C:\Downloads\image.jpg";
        client.DownloadFile(url, localPath);
    }
}

在上面的例子中,首先創建了一個WebClient對象,然後通過調用DownloadFile方法將遠程文件下載到本地。

二、使用HttpWebRequest類進行下載

HttpWebRequest是一個更底層的類,可以用於構建更複雜的HTTP請求,如設置請求頭、發送POST數據等。使用HttpWebRequest下載文件需要以下幾個步驟:

1. 引用System.Net命名空間。

2. 創建一個HttpWebRequest對象。

3. 調用GetResponse方法並獲取響應流。

4. 將響應流寫入本地文件。

下面是一個示例代碼:

using System.Net;

class Program
{
    static void Main(string[] args)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/image.jpg");
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream stream = response.GetResponseStream();
        byte[] buffer = new byte[4096];
        int bytesRead;
        string localPath = @"C:\Downloads\image.jpg";
        using (FileStream fs = new FileStream(localPath, FileMode.CreateNew))
        {
            while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
            {
                fs.Write(buffer, 0, bytesRead);
            }
        }
    }
}

在上面的例子中,創建一個HttpWebRequest對象,並調用GetResponse方法獲取響應流。然後,我們將響應流讀入緩衝區並將緩衝區寫入本地文件。

三、使用HttpClient類進行下載

HttpClient是C# 5.0及更高版本中引入的新類,可以提供更好的性能和簡化的API。使用HttpClient下載文件與使用WebClient類相似,只需提供文件的URL和本地路徑。下面是一個示例代碼:

using System.Net.Http;

class Program
{
    static async Task Main(string[] args)
    {
        HttpClient client = new HttpClient();
        string url = "http://example.com/image.jpg";
        string localPath = @"C:\Downloads\image.jpg";
        HttpResponseMessage response = await client.GetAsync(url);
        using (Stream stream = await response.Content.ReadAsStreamAsync())
        using (FileStream fs = new FileStream(localPath, FileMode.CreateNew))
        {
            await stream.CopyToAsync(fs);
        }
    }
}

在上面的例子中,我們創建了一個HttpClient對象,並使用GetAsync方法獲取響應。然後,我們將響應流讀入緩衝區並將緩衝區寫入本地文件。

四、下載文件時添加進度條

有時候,我們需要在下載文件時顯示進度條,以便用戶了解下載進度。我們可以使用WebClient或HttpClient類來實現這一點,同時跟蹤downloadProgress事件。

下面是一個WebClient下載帶有進度條的文件的示例代碼:

using System.Net;

class Program
{
    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        string url = "http://example.com/image.jpg";
        string localPath = @"C:\Downloads\image.jpg";
        client.DownloadProgressChanged += (sender, e) =>
        {
            Console.WriteLine($"Downloaded {e.BytesReceived} of {e.TotalBytesToReceive} bytes. {e.ProgressPercentage}% complete.");
        };
        client.DownloadFileAsync(new Uri(url), localPath);
    }
}

在上面的代碼中,我們綁定了DownloadProgressChanged事件,以跟蹤下載的進度。當下載進度發生變化時,事件處理程序將被調用,並顯示下載的字節數和已完成的百分比。

在HttpClient中,我們可以使用Progress類來跟蹤下載進度。下面是一個示例代碼:

using System.Net.Http;

class Program
{
    static async Task Main(string[] args)
    {
        HttpClient client = new HttpClient();
        string url = "http://example.com/image.jpg";
        string localPath = @"C:\Downloads\image.jpg";
        var progress = new Progress<long>();
        progress.ProgressChanged += (sender, bytesDownloaded) =>
        {
            Console.WriteLine($"Downloaded {bytesDownloaded} bytes.");
        };
        await client.DownloadFileWithProgressAsync(url, localPath, progress);
    }
}

static class HttpClientExtensions
{
    public static async Task DownloadFileWithProgressAsync(this HttpClient client, string requestUri, string filePath, IProgress<long> progress = null)
    {
        using (HttpResponseMessage response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead))
        using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
        {
            string fileToWriteTo = filePath;
            string directoryName = Path.GetDirectoryName(fileToWriteTo);
            if (!Directory.Exists(directoryName))
            {
                Directory.CreateDirectory(directoryName);
            }
            using (Stream streamToWriteTo = File.Open(fileToWriteTo, FileMode.Create))
            {
                await streamToReadFrom.CopyToAsync(streamToWriteTo, 4096, progress);
            }
        }
    }
}

在上面的代碼中,我們創建了一個名為progress的Progress<long>對象,並綁定了ProgressChanged事件以顯示下載進度。DownloadFileWithProgressAsync方法接收一個名為progress的參數,以便我們與進度條交互。在方法內部,我們使用HttpResponseMessage獲取響應流,並將其寫入本地文件。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/303437.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-31 11:49
下一篇 2024-12-31 11:49

相關推薦

  • vue下載無後綴名的文件被加上後綴.txt,有後綴名的文件下載正常問題的解決

    本文旨在解決vue下載無後綴名的文件被加上後綴.txt,有後綴名的文件下載正常的問題,提供完整的代碼示例供參考。 一、分析問題 首先,需了解vue中下載文件的情況。一般情況下,我們…

    編程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • 為什麼用cmd運行Java時需要在文件內打開cmd為中心

    在Java開發中,我們經常會使用cmd在命令行窗口運行程序。然而,有時候我們會發現,在運行Java程序時,需要在文件內打開cmd為中心,這讓很多開發者感到疑惑,那麼,為什麼會出現這…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Python將矩陣存為CSV文件

    CSV文件是一種通用的文件格式,在統計學和計算機科學中非常常見,一些數據分析工具如Microsoft Excel,Google Sheets等都支持讀取CSV文件。Python內置…

    編程 2025-04-29
  • Python zipfile解壓文件亂碼處理

    本文主要介紹如何在Python中使用zipfile進行文件解壓的處理,同時詳細討論在解壓文件時可能出現的亂碼問題的各種解決辦法。 一、zipfile解壓文件亂碼問題的根本原因 在P…

    編程 2025-04-29
  • Python如何導入py文件

    Python是一種開源的高級編程語言,因其易學易用和強大的生態系統而備受青睞。Python的import語句可以幫助用戶將一個模塊中的代碼導入到另一個模塊中,從而實現代碼的重用。本…

    編程 2025-04-29
  • Python合併多個相同表頭文件

    對於需要合併多個相同表頭文件的情況,我們可以使用Python來實現快速的合併。 一、讀取CSV文件 使用Python中的csv庫讀取CSV文件。 import csv with o…

    編程 2025-04-29
  • Python寫文件a

    Python語言是一種功能強大、易於學習、通用並且高級編程語言,它具有許多優點,其中之一就是能夠輕鬆地進行文件操作。文件操作在各種編程中都佔有重要的位置,Python作為開發人員常…

    編程 2025-04-29

發表回復

登錄後才能評論