URLDownloadToFile下载一半文件

时间:2014-05-21 12:59:37

标签: c# .net

我使用URLDownload来下载文件,我下载了5个文件(zip),其中2个已损坏,第一个我试图重新下载(2-3次),它在20后运行第二个(次) stiil dameged,它似乎在它完成之前停止下载。

已损坏 (我手动下载此文件,拉链打开正常,大小为75kb,我从URLDownload下载的文件有11kb播种,你看到差异并知道它不是完整下载\损坏)

我的代码

[DllImport("urlmon.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern Int32 URLDownloadToFile(Int32 pCaller, string szURL, string szFileName, Int32 dwReserved, Int32 lpfnCB);

 int response = URLDownloadToFile(0, Link, FilePath, 0, 0);

       if (response == 0)
        {
      lsUtils.WriteToLog("File  " + FileName + " downloaded.", true);
      int zipTry = 10;
      if (!isValidZip(FilePath))
                 {
  clsUtils.WriteToLog("Attempting to re-download damaged file   " + FileName, true);
  while (!isValidZip(FilePath) && zipTry > 1)
        {
  clsUtils.WriteToLog("File  " + FileName + " Zip file damaged.", true);
  response = URLDownloadToFile(0, Link, FilePath, 0, 0);
                                            zipTry--;

                                        }
                                    }

1 个答案:

答案 0 :(得分:0)

为什么要使用URLDownloadToFile?这是一种在.NET中下载文件的极其圆润的方式。

相反,这是.NET 4.5 +中的一个简单示例:

async Task DownloadAndSaveAsync(string url, string filePath)
{
    HttpClient client = new HttpClient();
    var response = await client.GetAsync(url);

    // Was the request successful?
    if (response == null || !response.IsSuccessStatusCode) return;

    using (var file = File.Create(filePath))
    {
        await response.Content.CopyToAsync(file);
    }
}

如果您没有.NET 4.5+,那么您将不得不使用HttpWebRequest,但它仍然比进行P / Invoke好得多。

至于原来的URLDownloadToFile问题,我猜它没有阻塞,所以当你检查zip是否有效时它仍在后台下载,然后你用第二次尝试等覆盖它。所以并不是它没有通过下载 - 你没有等待足够长的时间。但同样,这只是猜测。您不应该在Internet Explorer上创建依赖项,除非您确实需要它们:)