c#无法下载文件(其他进程使用的文件)

时间:2014-05-02 01:06:45

标签: c# exception download webrequest

我有主应用程序和更新程序。我从主程序启动更新程序,并在更新程序启动后,我杀死主程序。好了,现在好了。 现在,我从网站上检查一个必须更新的文件的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;

1 个答案:

答案 0 :(得分:0)

尝试使用ProcMon(http://technet.microsoft.com/en-au/sysinternals/bb896645.aspx)并启用文件监控,您可以看到锁定文件的进程

该目录下的所有文件或仅特定文件是否会发生?