等到通过webClient从URL下载文件

时间:2015-01-29 10:01:44

标签: c# webclient-download

我很难从URL下载几个MB excel文件,然后使用它。我使用VS2010所以我不能使用await关键字。 我的代码如下:

using (WebClient webClient = new WebClient())
                {
                    // setting Windows Authentication
                    webClient.UseDefaultCredentials = true;
                    // event fired ExcelToCsv after file is downloaded
                    webClient.DownloadFileCompleted += (sender, e) => ExcelToCsv(fileName);
                    // start download
                    webClient.DownloadFileAsync(new Uri("http://serverx/something/Export.ashx"), exportPath);
                }

ExcelToCsv()方法

中的一行
using (FileStream stream = new FileStream(filePath, FileMode.Open))

给我一​​个错误:

  

System.IO.IOException:进程无法访问该文件,因为它   正在被另一个进程使用。

我只在没有事件的情况下尝试了webClient.DownloadFile(),但它会抛出相同的错误。如果我不处理也会抛出相同的错误。我该怎么办?

临时解决方法可能是Sleep()方法,但不是防弹。

谢谢

编辑: 我尝试了标准处理的第二种方法,但我在代码中有错误

  using (WebClient webClient = new WebClient())
                {
                    // nastaveni ze webClient ma pouzit Windows Authentication
                    webClient.UseDefaultCredentials = true;
                    // <--- I HAVE CONVERT ASYNC ERROR IN THIS LINE
                    webClient.DownloadFileCompleted += new DownloadDataCompletedEventHandler(HandleDownloadDataCompleted);

                    // spusteni stahovani
                    webClient.DownloadFile(new Uri("http://czprga2001/Logio_ZelenyKyblik/Export.ashx"), TempDirectory + PSFileName);
                }

public delegate void DownloadDataCompletedEventHandler(string fileName);
        public event DownloadDataCompletedEventHandler DownloadDataCompleted;
        static void HandleDownloadDataCompleted(string fileName)
        { 
            ExcelToCsv(fileName);
        }

编辑:接近3 我试过这段代码

while (true)
                {
                    if (isFileLocked(downloadedFile))
                    {
                        System.Threading.Thread.Sleep(5000); //wait 5s
                        ExcelToCsv(fileName);
                        break;
                    }
                }

似乎它永远无法访问:/我不明白。

1 个答案:

答案 0 :(得分:1)

尝试使用DownloadFile代替DownloadFileAsync,就像在编辑1中一样,如下所示:

string filename=Path.Combine(TempDirectory, PSFileName);
using (WebClient webClient = new WebClient())
                {
                    // nastaveni ze webClient ma pouzit Windows Authentication
                    webClient.UseDefaultCredentials = true;    
                    // spusteni stahovani
                    webClient.DownloadFile(new Uri("http://czprga2001/Logio_ZelenyKyblik/Export.ashx"), filename);
                }
ExcelToCsv(filename);  //No need to create the event handler if it is not async

从您的示例看来,您似乎不需要异步下载,因此请使用同步下载并避免可能的相关问题,例如here

还可以使用Path.Combine组合路径的某些部分,例如文件夹和文件名。

还有可能被其他东西锁定,使用Sysinternals Process Explorer的Find DLL或Handle函数来检查它。

使用本地磁盘存储下载的文件以防止网络出现问题。