在C#上使用数组下载多个文件

时间:2016-10-12 01:09:15

标签: c#

我正在尝试编写一个下载程序,它将从远程服务器下载5个文件到最终用户计算机。遇到问题。通过使用Function After Function,它会下载但是,我想让它读取一个远程文件并获取文件名,将它们放入一个数组中,然后从一个函数中逐个下载它们。这是使用Asynch用C#编写的。

我的代码如下。任何帮助,将不胜感激。

  // Start Downloads
    private void getPatch()
    {
        sw.Start();
        string patchlist = Settings1.Default.patchlist; 
        label1.Text = "Downloading";
        button2.Image = Properties.Resources.PlayButtonDisabled;
        button4.Visible = false;
        progressBar1.Visible = true;
        Directory.CreateDirectory("WTF");

        string[] files = new string[6];
        files[0] = "libeay32.dll";
        files[1] = "libmysql.dll";
        files[2] = "libssl32.dll";
        files[3] = "ssleay32.dll";
        files[4] = "connection_patcher.exe";
        files[5] = "Config.conf";

        // Loop 
        foreach (var file in files)
        {

            var webClient = new WebClient();
            webClient.DownloadFile(Settings1.Default.baseURL + file, file);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
            webClient.DownloadStringCompleted += OnGetDownloadedStringCompleted;
        }
    }

2 个答案:

答案 0 :(得分:1)

仔细看看你的foreach(...)循环。

foreach (var url in filelist)

从它的外观来看,你实际上将循环遍历字符串“http://somedomain.com/file_list”中的每个字符,这是不好的。在这里避免使用'var'关键字会在编译时捕获到它。

webClient.DownloadFileTaskAsync(new Uri(Settings1.Default.baseURL + rFile), rFile);

rFile实际上会从服务器下载文件的全部内容,所以5行一起放在一个字符串中,这对我们也没有好处。

从文件列表位置获取内容后,需要将其拆分并遍历每一行。

string rFile = webClient.DownloadString(filelist);
foreach (string singleFile in rFile.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
{
    await webClient.DownloadFileTaskAsync(new Uri(Settings1.Default.baseURL + singleFile), singleFile);
}

答案 1 :(得分:0)

我可以看到你可能会忽视的一些事情。

首先,你正在迭代foreach(文件列表中的网址),但我没有看到你使用' url'循环中的任何地方。循环中的每个步骤的下载字符串都是相同的。

其次,您正在使用异步运行的DownloadFileTaskAsync,这也意味着所有文件都在同时下载。看起来你会得到一个错误,但只是把它放在这里看着我会想象只有循环的最后一次迭代才真正起作用。无论哪种方式,这里都是您的代码以及我认为可以解决的问题。

此外,最好在执行前连接事件处理程序。

//您的代码

private void getFiles()
{
    string filelist = "http://somedomain.com/file_list"; 
            label1.Text = "Downloading";
            button2.Image = Properties.Resources.ButtonDisabled;
            progressBar1.Visible = true;
            var webClient = new WebClient();
            string rFile = webClient.DownloadString(filelist);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
            foreach (var url in filelist)
            {
              webClient.DownloadFileTaskAsync(new Uri(Settings1.Default.baseURL + rFile), rFile);
            }
            webClient.DownloadStringCompleted += OnGetDownloadedStringCompleted;

}
  

//假设您正在尝试执行的操作,一次只能读取1个文件。我已添加await / async以正确使用DownloadFileAsync任务。希望这有助于或让您看到您可能忽略的内容,因为我只是将此作为修复。

    private async void getFiles()
    {
        string filelist = "http://somedomain.com/file_list";
        //label1.Text = "Downloading";
        //button2.Image = Properties.Resources.ButtonDisabled;
        //progressBar1.Visible = true;
        using (var webClient = new WebClient())
        {
            webClient.DownloadStringCompleted += OnGetDownloadedStringCompleted;
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
            var rFile = webClient.DownloadString(filelist);

            //rFile needs broken up somehow since it is a string and not an array... unless you want the characters to be the array... which is odd.
            //So for dummying the code to work for now...
            var rFiles = rFile.Split(',');

            foreach (var url in rFiles)
                await webClient.DownloadFileTaskAsync(new Uri(Settings1.Default.baseURL + url), rFile);
        }
    }