C # 'daki bir URL'den dosya nasıl indirilir?


352

URL yolundan dosya indirmenin basit yolu nedir?


13
System.Net.WebClient'e bir göz atın
seanb

Yanıtlar:


475
using (var client = new WebClient())
{
    client.DownloadFile("http://example.com/file/song/a.mpeg", "a.mpeg");
}

24
Şimdiye kadarki en iyi çözüm ama 1 önemli satır eklemek istiyorum 'client.Credentials = new NetworkCredential ("KullanıcıAdı", "Şifre");'
Geliştirici

3
Hoş bir yan etki: Bu yöntem aynı zamanda 1. parametre olarak yerel dosyaları destekler
oo_dev

MSDN dokümanı şimdi HttpClient'i kullanmaktan bahsetti: docs.microsoft.com/en-us/dotnet/api/…
StormsEngineering

Bence WebClient çok daha basit ve basit bir çözüm gibi görünüyor.
StormsEngineering

1
@ copa017: Örneğin URL kullanıcı tarafından sağlanıyorsa ve C # kodu bir web sunucusunda çalışıyorsa tehlikeli olabilir.
Heinzi

177

Bu ad alanını ekle

using System.Net;

Eşzamansız olarak indirin ve bir kullanıcı arayüzünün içindeki indirme durumunu göstermek için ProgressBar

private void BtnDownload_Click(object sender, RoutedEventArgs e)
{
    using (WebClient wc = new WebClient())
    {
        wc.DownloadProgressChanged += wc_DownloadProgressChanged;
        wc.DownloadFileAsync (
            // Param1 = Link of file
            new System.Uri("http://www.sayka.com/downloads/front_view.jpg"),
            // Param2 = Path to save
            "D:\\Images\\front_view.jpg"
        );
    }
}
// Event to track the progress
void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
}

14
Soru en basit yolu soruyor. Daha karmaşık hale getirmek onu en basit hale getirmiyor.
Enigmativite

75
Çoğu kişi indirme sırasında bir ilerleme çubuğunu tercih eder. Bu yüzden bunu yapmanın en basit yolunu yazdım. Bu cevap olmayabilir, ancak Stackoverflow gereksinimini karşılar. Birine yardım etmek.
Sayka

3
İlerleme çubuğunu dışarıda bırakırsanız, bu diğer cevap kadar basittir. Bu yanıt ayrıca ad alanını içerir ve G / Ç için zaman uyumsuzluğu kullanır. Ayrıca soru en basit yolu istemiyor, sadece basit bir yol. :)
Josh

Ben bir basit ve bir ilerleme çubuğu ile 2 cevap vermek daha iyi olacağını düşünüyorum
Jesse de gans

@ Jessedegans İlerleme çubuğu olmadan nasıl indirileceğini gösteren bir cevap zaten var. Bu yüzden asenkron indirme ve ilerleme
çubuğu

76

Kullanım System.Net.WebClient.DownloadFile:

string remoteUri = "http://www.contoso.com/library/homepage/images/";
string fileName = "ms-banner.gif", myStringWebResource = null;

// Create a new WebClient instance.
using (WebClient myWebClient = new WebClient())
{
    myStringWebResource = remoteUri + fileName;
    // Download the Web resource and save it into the current filesystem folder.
    myWebClient.DownloadFile(myStringWebResource, fileName);        
}

42
using System.Net;

WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");

33
SO hoş geldiniz! Genel olarak, halihazırda yüksek oranda onaylanmış cevapları olan mevcut ve eski bir soruya düşük kaliteli bir cevap göndermek iyi bir fikir değildir.
ThiefMaster

28
Cevabımı seanb'in yorumundan buldum, ama gerçekten bu "düşük kaliteli" cevabı diğerlerine tercih ediyorum. Tam (ifade kullanarak), özlü ve anlaşılması kolay. Eski bir soru olmak önemsiz, IMHO.
Josh

21
Ama Kullanma ile cevap çok daha iyi olduğunu düşünüyorum, çünkü, WebClient kullanıldıktan sonra atılması gerektiğini düşünüyorum. Kullanarak içine koymak, atılmasını sağlar.
Ricardo Polo Jaramillo

5
Bu kod örneğinde
atmakla

17

Durumu konsola yazdırırken dosyayı indirmek için sınıfı tamamlayın.

using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Threading;

class FileDownloader
{
    private readonly string _url;
    private readonly string _fullPathWhereToSave;
    private bool _result = false;
    private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(0);

    public FileDownloader(string url, string fullPathWhereToSave)
    {
        if (string.IsNullOrEmpty(url)) throw new ArgumentNullException("url");
        if (string.IsNullOrEmpty(fullPathWhereToSave)) throw new ArgumentNullException("fullPathWhereToSave");

        this._url = url;
        this._fullPathWhereToSave = fullPathWhereToSave;
    }

    public bool StartDownload(int timeout)
    {
        try
        {
            System.IO.Directory.CreateDirectory(Path.GetDirectoryName(_fullPathWhereToSave));

            if (File.Exists(_fullPathWhereToSave))
            {
                File.Delete(_fullPathWhereToSave);
            }
            using (WebClient client = new WebClient())
            {
                var ur = new Uri(_url);
                // client.Credentials = new NetworkCredential("username", "password");
                client.DownloadProgressChanged += WebClientDownloadProgressChanged;
                client.DownloadFileCompleted += WebClientDownloadCompleted;
                Console.WriteLine(@"Downloading file:");
                client.DownloadFileAsync(ur, _fullPathWhereToSave);
                _semaphore.Wait(timeout);
                return _result && File.Exists(_fullPathWhereToSave);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Was not able to download file!");
            Console.Write(e);
            return false;
        }
        finally
        {
            this._semaphore.Dispose();
        }
    }

    private void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.Write("\r     -->    {0}%.", e.ProgressPercentage);
    }

    private void WebClientDownloadCompleted(object sender, AsyncCompletedEventArgs args)
    {
        _result = !args.Cancelled;
        if (!_result)
        {
            Console.Write(args.Error.ToString());
        }
        Console.WriteLine(Environment.NewLine + "Download finished!");
        _semaphore.Release();
    }

    public static bool DownloadFile(string url, string fullPathWhereToSave, int timeoutInMilliSec)
    {
        return new FileDownloader(url, fullPathWhereToSave).StartDownload(timeoutInMilliSec);
    }
}

Kullanımı:

static void Main(string[] args)
{
    var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec);
    Console.WriteLine("Done  - success: " + success);
    Console.ReadLine();
}

1
Lütfen SemaphoreSlimbu bağlamda neden kullandığınızı açıklayabilir misiniz ?
mmushtaq

10

Bunu kullanmayı deneyin:

private void downloadFile(string url)
{
     string file = System.IO.Path.GetFileName(url);
     WebClient cln = new WebClient();
     cln.DownloadFile(url, file);
}

dosya nereye kaydedilecek?
IB

Dosya, yürütülebilir dosyanın bulunduğu konuma kaydedilir. Tam yol istiyorsanız, dosya ile birlikte tam yolu kullanın (indirilecek öğenin dosya
adıdır


8

Bir ağa GetIsNetworkAvailable()bağlı değilken boş dosyalar oluşturmaktan kaçınmak için kullanarak ağ bağlantısı olup olmadığını kontrol edin.

if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
    using (System.Net.WebClient client = new System.Net.WebClient())
    {                        
          client.DownloadFileAsync(new Uri("http://www.examplesite.com/test.txt"),
          "D:\\test.txt");
    }                  
}

Ben öneririm değil kullanarak GetIsNetworkAvailable()döner çok fazla yanlış-pozitif, benim deneyim olarak.
Cherona

LAN gibi bir bilgisayar ağında olmadığınız sürece, GetIsNetworkAvailable()her zaman doğru şekilde dönecektir. Böyle bir durumda System.Net.WebClient().OpenRead(Uri), varsayılan bir URL verildiğinde döndürülüp döndürülmediğini görmek için yöntemi kullanabilirsiniz . Bkz WebClient.OpenRead ()
haZya

2

Aşağıdaki kod, orijinal ada sahip indirme dosyası için mantık içeriyor

private string DownloadFile(string url)
    {

        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        string filename = "";
        string destinationpath = Environment;
        if (!Directory.Exists(destinationpath))
        {
            Directory.CreateDirectory(destinationpath);
        }
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result)
        {
            string path = response.Headers["Content-Disposition"];
            if (string.IsNullOrWhiteSpace(path))
            {
                var uri = new Uri(url);
                filename = Path.GetFileName(uri.LocalPath);
            }
            else
            {
                ContentDisposition contentDisposition = new ContentDisposition(path);
                filename = contentDisposition.FileName;

            }

            var responseStream = response.GetResponseStream();
            using (var fileStream = File.Create(System.IO.Path.Combine(destinationpath, filename)))
            {
                responseStream.CopyTo(fileStream);
            }
        }

        return Path.Combine(destinationpath, filename);
    }

1

Dosya indirme işlemi sırasında durumu bilmeniz ve bir ProgressBar'ı güncellemeniz veya istekte bulunmadan önce kimlik bilgilerini kullanmanız gerekebilir.

İşte bu seçenekleri kapsayan bir örnek. Lambda notasyonu ve String enterpolasyonu kullanılmıştır:

using System.Net;
// ...

using (WebClient client = new WebClient()) {
    Uri ur = new Uri("http://remotehost.do/images/img.jpg");

    //client.Credentials = new NetworkCredential("username", "password");
    String credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes("Username" + ":" + "MyNewPassword"));
    client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}";

    client.DownloadProgressChanged += (o, e) =>
    {
        Console.WriteLine($"Download status: {e.ProgressPercentage}%.");

        // updating the UI
        Dispatcher.Invoke(() => {
            progressBar.Value = e.ProgressPercentage;
        });
    };

    client.DownloadDataCompleted += (o, e) => 
    {
        Console.WriteLine("Download finished!");
    };

    client.DownloadFileAsync(ur, @"C:\path\newImage.jpg");
}

1

Araştırmaya göre WebClient.DownloadFileAsync, dosyayı indirmenin en iyi yolu olduğunu buldum . MevcutturSystem.Net ad ve de .net çekirdeği destekler.

İşte dosyayı indirmek için örnek kod.

using System;
using System.IO;
using System.Net;
using System.ComponentModel;

public class Program
{
    public static void Main()
    {
        new Program().Download("ftp://localhost/test.zip");
    }
    public void Download(string remoteUri)
    {
        string FilePath = Directory.GetCurrentDirectory() + "/tepdownload/" + Path.GetFileName(remoteUri); // path where download file to be saved, with filename, here I have taken file name from supplied remote url
        using (WebClient client = new WebClient())
        {
            try
            {
                if (!Directory.Exists("tepdownload"))
                {
                    Directory.CreateDirectory("tepdownload");
                }
                Uri uri = new Uri(remoteUri);
                //password username of your file server eg. ftp username and password
                client.Credentials = new NetworkCredential("username", "password");
                //delegate method, which will be called after file download has been complete.
                client.DownloadFileCompleted += new AsyncCompletedEventHandler(Extract);
                //delegate method for progress notification handler.
                client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgessChanged);
                // uri is the remote url where filed needs to be downloaded, and FilePath is the location where file to be saved
                client.DownloadFileAsync(uri, FilePath);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
    public void Extract(object sender, AsyncCompletedEventArgs e)
    {
        Console.WriteLine("File has been downloaded.");
    }
    public void ProgessChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine($"Download status: {e.ProgressPercentage}%.");
    }
}

Yukarıdaki kod dosyası tepdownloadile proje dizininin klasörüne indirilecektir . Yukarıdaki kodun ne yaptığını anlamak için lütfen koddaki yorumu okuyun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.