C# 下载多个文件WebClient

C# 下载多个文件WebClient,c#,download,webclient,C#,Download,Webclient,我正在尝试下载多个文件,但它没有像我希望的那样工作。 有人能告诉我这个脚本有什么问题吗,因为我已经尝试了很多东西,真的不知道该怎么做了 public static void DownloadFile(string url) { WebClient client = new WebClient(); var name = url.Substring(url.LastIndexOf('/')).Remove(0, 1);

我正在尝试下载多个文件,但它没有像我希望的那样工作。 有人能告诉我这个脚本有什么问题吗,因为我已经尝试了很多东西,真的不知道该怎么做了

public static void DownloadFile(string url)
        {
            WebClient client = new WebClient();
            var name = url.Substring(url.LastIndexOf('/')).Remove(0, 1);
            foreach (var item in urls)
            {
                client.DownloadFile(item, "C:\\" + name);
            }
        }

        private void btnGo_Click(object sender, EventArgs e)
        {
            urls.Add("url1");
            urls.Add("url2");
            urls.Add("url3");
            Parallel.ForEach(urls,
               new ParallelOptions { MaxDegreeOfParallelism = 10 }, 
               DownloadFile);
        }

我会用一个字母来代替

这就是代码的样子:

private List<string> urls = new List<string>();

private void btnGo_Click(object sender, EventArgs e)
{
    urls.Add("http://199.91.152.106/ua0p3fbc5nlg/gg2w2fq4ljc1nnd/MicroCraft_Beta.zip");
    Parallel.ForEach(urls, new ParallelOptions { MaxDegreeOfParallelism = 10 }, DownloadFile);
}

public static void DownloadFile(string url)
{
    var req = (HttpWebRequest)WebRequest.Create(url);
    var name = url.Substring(url.LastIndexOf('/') + 1);
    using (var res = (HttpWebResponse)req.GetResponse())
    using (var resStream = res.GetResponseStream())
    using (var fs = new FileStream("C:\\" + name, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        // Save to file
        var buffer = new byte[8 * 1024]; // 8 KB buffer
        int len; // Read count
        while ((len = resStream.Read(buffer, 0, buffer.Length)) > 0)
            fs.Write(buffer, 0, buffer.Length);
    }
}
我会用一个字母来代替

这就是代码的样子:

private List<string> urls = new List<string>();

private void btnGo_Click(object sender, EventArgs e)
{
    urls.Add("http://199.91.152.106/ua0p3fbc5nlg/gg2w2fq4ljc1nnd/MicroCraft_Beta.zip");
    Parallel.ForEach(urls, new ParallelOptions { MaxDegreeOfParallelism = 10 }, DownloadFile);
}

public static void DownloadFile(string url)
{
    var req = (HttpWebRequest)WebRequest.Create(url);
    var name = url.Substring(url.LastIndexOf('/') + 1);
    using (var res = (HttpWebResponse)req.GetResponse())
    using (var resStream = res.GetResponseStream())
    using (var fs = new FileStream("C:\\" + name, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        // Save to file
        var buffer = new byte[8 * 1024]; // 8 KB buffer
        int len; // Read count
        while ((len = resStream.Read(buffer, 0, buffer.Length)) > 0)
            fs.Write(buffer, 0, buffer.Length);
    }
}

在下载文件代码中,您正在将所有文件下载到同一个文件,该代码假定对该函数的单个调用将下载所有文件

修正:

选项1:不要使用
Parallel.ForEach
,只需调用DownloadFile一次。为每次下载指定唯一的文件名。也就是说,通过参与您正在下载的Url,或者简单地使用随机/临时文件名

类似这样(假设URL是某种
IEnumerable

选项2:使用
Parallel.ForEach
但将下载文件代码更改为仅下载单个文件:

public static void DownloadFile(string url)
{
    WebClient client = new WebClient();
    var name = url.Substring(url.LastIndexOf('/')).Remove(0, 1);
    client.DownloadFile(url, "C:\\" + name);
}

在下载文件代码中,您正在将所有文件下载到同一个文件,该代码假定对该函数的单个调用将下载所有文件

修正:

选项1:不要使用
Parallel.ForEach
,只需调用DownloadFile一次。为每次下载指定唯一的文件名。也就是说,通过参与您正在下载的Url,或者简单地使用随机/临时文件名

类似这样(假设URL是某种
IEnumerable

选项2:使用
Parallel.ForEach
但将下载文件代码更改为仅下载单个文件:

public static void DownloadFile(string url)
{
    WebClient client = new WebClient();
    var name = url.Substring(url.LastIndexOf('/')).Remove(0, 1);
    client.DownloadFile(url, "C:\\" + name);
}


答案就在这里@GX。我试过了,但根本无法让它工作:(.你的代码到底在哪里中断?你调试了吗?@GX。它同时下载所有文件并相互覆盖,因此你得到了3个损坏的文件。答案是@GX。我试过了,但根本无法让它工作:(.你的代码到底在哪里中断?你调试了吗?@GX。它同时下载所有文件并相互覆盖,因此你得到了3个损坏的文件。我找到了一个脚本,我会将其添加到我的帖子中,但这也不起作用:(.@Aidiakapi hum…不…这里应该使用WebClient看看下载文件function@GX.
WebClient
可以用于此,但本质上
WebClient
只是IE的一个花式包装。另一方面,
HttpWebRequest
是基本要求。当脚本下载les,它们都被破坏了:(.知道为什么吗?@Darkshadw很可能是因为名称冲突,你能给我一些示例URL以及你希望它们被映射的方式(例如我希望:映射到C:\testfile.html)然后我会给你代码。现在我已经为一个增量文件名添加了代码。我找到了一个可以这样做的脚本,我会将它添加到我的帖子中,但这也不起作用:(.@Aidiakapi hum…不…这里应该使用WebClient看看下载文件function@GX.
WebClient
可以用于此,但本质上
WebClient
只是IE的一个花式包装。另一方面,
HttpWebRequest
是基本要求。当脚本下载les,它们都被破坏了:(.知道为什么吗?@Darkshadw很可能是因为名称冲突,你能给我一些示例URL以及你希望它们被映射的方式(例如我希望:映射到C:\testfile.html)然后我会给你代码。现在我已经为一个增量文件名添加了代码。正如你在他的代码中看到的,他正在使用一些东西来创建一个不同的文件名。名称显然是一个变量,它基于url。他提供了代码:
var name=url.Substring(url.LastIndexOf('/')).Remove(0,1)
@Aidiakapi,明白了…被代码弄糊涂了-OP实际上多次下载同一个文件-更新答案…@Aidiakapi,谢谢。看看更新的答案是否反映了你的评论。我想是的,尽管我仍然不喜欢使用臃肿的
网络客户端来下载文件:P在他的代码中,他使用了一些东西来创建不同的文件名。名称显然是一个基于url的变量。他为其提供了代码:
var name=url.Substring(url.LastIndexOf('/'))。Remove(0,1)
@Aidiakapi,明白了…被代码弄糊涂了-OP实际上多次下载同一个文件-更新答案…@Aidiakapi,谢谢。看看更新的答案是否反映了你的评论。我想是的,尽管我仍然不喜欢使用臃肿的
网络客户端来下载文件:P。
foreach (var item in urls)
{
   var name = item.Substring(item.LastIndexOf('/')).Remove(0, 1);
   client.DownloadFile(item, "C:\\" + name);
}
public static void DownloadFile(string url)
{
    WebClient client = new WebClient();
    var name = url.Substring(url.LastIndexOf('/')).Remove(0, 1);
    client.DownloadFile(url, "C:\\" + name);
}