等待下载最后一个文件

问题描述 投票:0回答:1

我有用于下载PDF文件的代码。现在,当我执行下一个任务时遇到了一个问题,但是最后一个文件的下载尚未完成。执行完当前代码后,最后一个文件约为650 Mb,应为1300 Mb。另外,由于无法完全下载,因此无法将其打开,这就是为什么损坏了。

该进程无法访问该文件,因为它正在被另一个文件使用过程。

如何确保文件被下载?

            HtmlDocument htmlDoc = new HtmlWeb().Load("http://example.com/");

            // Thread.Sleep(5000); // wait some time

            HtmlNodeCollection ProductListPage = htmlDoc.DocumentNode.SelectNodes("//div[@class='productContain padb6']//div[@class='large-4 medium-4 columns']/a");
            foreach (HtmlNode src in ProductListPage)
            {
                htmlDoc = new HtmlWeb().Load(src.Attributes["href"].Value);

                // Thread.Sleep(5000); // wait some time

                HtmlNodeCollection LinkTester = htmlDoc.DocumentNode.SelectNodes("//div[@class='row padt6 padb4']//a");
                if (LinkTester != null)
                {
                    foreach (var dllink in LinkTester)
                    {
                        string LinkURL = dllink.Attributes["href"].Value;
                        Console.WriteLine(LinkURL);

                        string ExtractFilename = LinkURL.Substring(LinkURL.LastIndexOf("/"));
                        var DLClient = new WebClient();

                        // Thread.Sleep(5000); // wait some time

                        DLClient.DownloadFileAsync(new Uri(LinkURL), @"C:\temp\" + ExtractFilename);
                    }
                }
            }

我的下一个过程是重命名下载的文件:

    var files = Directory.GetFiles(@"C:\temp\", "*.pdf");
    // string prefix = "SomePrefix";
    foreach (var file in files)
    {
        string newFileName = Path.Combine(Path.GetDirectoryName(file), file.Replace("-", " "));
        File.Move(file, newFileName);
    }

重命名可以顺利进行,直到最后一个文件没有完全下载,这就是我遇到的错误。

我在这两个之间添加了Thread.Sleep(5000); // wait some time,但这可能不是最好的解决方案,因为当前的等待时间不足,并且可以根据互联网连接而改变?

c# web-scraping web-crawler html-agility-pack
1个回答
0
投票

您当然不希望使用WebClient.DownloadFileAsync,但要使用其较新的后继产品WebClient.DownloadFileTaskAsync。可以这样使用:

WebClient.DownloadFileTaskAsync

这是一个await DLClient.DownloadFileAsyncTask(new Uri(LinkURL), @"C:\temp\" + ExtractFilename); 进程,因此您的调用方法也必须是async。通过async对其进行设置,可以确保仅在下载完成(或失败)之后程序才能继续。

© www.soinside.com 2019 - 2024. All rights reserved.