我正在编写一个 Windows 服务,它从服务器上的 Uri 路径收集一个 zip 文件。我遇到的问题是当我的服务尝试收集压缩文件时,它仍在服务器上被写入。如果我Thread.Sleep(15000)
在打电话下载文件之前放了一个,它工作正常。处理视频报警时,这种延迟是不可接受的。如果可能的话,我希望在调用下载函数之前在 while 循环中添加一个检查,以查看文件是否已准备好从服务器 URI 下载。这可能吗?
我正在使用异步 WebClient 下载 zip 文件:
internal void DownloadZippedFile(string eventId)
{
try
{
Logger.LogInformation("Extracing Video for event: " + eventId);
using (WebClient webClient = new WebClient())
{
string urlPath = sureViewZipHost + "/archiveevent?user=" + sureViewUserId + "&password=" + sureViewPassword + "&event=" + eventId;
string tempPath = Path.GetTempPath();
long lReceived = 0;
long lTotal = 0;
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
webClient.DownloadProgressChanged += delegate(object sender, DownloadProgressChangedEventArgs e)
{
Logger.LogInformation("downloaded {0} of {1} bytes. {2}% complete", e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage);
// Assign to outer variables to allow busy-wait to check.
lReceived = e.BytesReceived;
lTotal = e.TotalBytesToReceive;
};
webClient.DownloadFileAsync(new Uri(urlPath), tempPath + "//" + eventId + ".zip",eventId);
}
}
catch (Exception ex)
{
Logger.LogError("Error extracting Video " + ex.Message);
}
}
使用上面的代码永远不会引发异常。我通过打开部分下载的 zip 发现了这个问题,它包含:
400 错误请求
System.IO.IOException:该进程无法访问文件“C:\FileStore\G98\E16884\R6507679\JpegBackup022620132102384484.zip”,因为它正被另一个进程使用。