在c#中使用数组下载多个文件

本文关键字:下载 文件 数组 | 更新日期: 2023-09-27 18:12:35

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

我的代码下面。任何帮助都会很感激。

  // 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;
        }
    }

在c#中使用数组下载多个文件

仔细看看你的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);
}

我马上就看到了你可能忽略的一些事情。

首先你迭代foreach (url在filelist),但我没有看到你在循环的任何地方使用'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;
}

//假设你的代码每次只抓取一个文件。我已经添加了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);
        }
    }