我有主应用程序和更新程序。我从主程序启动更新程序,并在更新程序启动后,我杀死主程序。好了,现在好了。 现在,我从网站上检查一个必须更新的文件的xml文件。 我用它来下载文件:
Stopwatch sw = new Stopwatch();
public void DownloadFile(string urlAddress, string location)
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
Uri URL = urlAddress.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ? new Uri(urlAddress) : new Uri("http://" + urlAddress);
sw.Start();
try
{
webClient.DownloadFileAsync(URL, location);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
}
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
labelSpeed.Text = string.Format("{0} kb/s", (e.BytesReceived / 1024d / sw.Elapsed.TotalSeconds).ToString("0.00"));
progressBar.Value = e.ProgressPercentage;
labelPerc.Text = e.ProgressPercentage.ToString() + "%";
downloaded.Text = string.Format("{0} MB's / {1} MB's",
(e.BytesReceived / 1024d / 1024d).ToString("0.00"),
(e.TotalBytesToReceive / 1024d / 1024d).ToString("0.00"));
}
private void Completed(object sender, AsyncCompletedEventArgs e)
{
sw.Reset();
if (e.Error != null)
{
MessageBox.Show(e.Error.InnerException.Message,e.Error.Message);
}
if (e.Cancelled == true)
{
MessageBox.Show("Download has been canceled.");
}
else
{
MessageBox.Show("Download completed!");
}
}
我使用以下方法调用下载方法:
foreach (string file in dld)
{
DownloadFile(file, AppDomain.CurrentDomain.BaseDirectory+file);
MessageBox.Show("done with:" + file);
}
其中,dld为List<string> dld = new List<string>();
当我调用下载方法时,我收到此错误:
"An exception occured during a WebClient request.
The process cannot access the file xxx because it is used by another process."
PS:使用管理员权限启动更新程序。
我真的不明白代码有什么问题。我已经在这里问过同样的问题,但它只针对一个文件(用管理员权限解决)。现在我有多个文件要下载,即使程序是以管理员权限启动的,它也不起作用。我仔细检查了一下,主程序关闭了。
感谢任何帮助。
稍后编辑:我想我发现了这个问题。我有个地方
Assembly assembly = Assembly.LoadFrom(path);
Version ver = assembly.GetName().Version;
我认为此命令会锁定文件。
现在我必须找出如何加载和卸载程序集。回到谷歌。
最后编辑:找到解决方案并且有效。
AssemblyName assembly = AssemblyName.GetAssemblyName(path);
Version ver = assembly.Version;
答案 0 :(得分:0)
尝试使用ProcMon(http://technet.microsoft.com/en-au/sysinternals/bb896645.aspx)并启用文件监控,您可以看到锁定文件的进程
该目录下的所有文件或仅特定文件是否会发生?