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