我使用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--;
}
}
答案 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上创建依赖项,除非您确实需要它们:)