【问题标题】:C# System.ComponentModel.Win32ExceptionC# System.ComponentModel.Win32Exception
【发布时间】:2018-03-11 07:05:53
【问题描述】:

我一直在尝试从网站下载一个程序,然后运行该程序。当我运行它时,我得到以下异常。我是 C# 新手,所以请使用简单的语言。

System.ComponentModel.Win32Exception: '进程无法访问该文件,因为它正被另一个进程使用'

没有其他进程正在使用这个程序,应该可以正常运行。

        if (restart == "1")
        {
            wc.DownloadFileCompleted += new 
            AsyncCompletedEventHandler(FileDowloadComplete);
            Uri imageurl = new Uri(Website);
            System.Threading.Thread.Sleep(1000);
            wc.DownloadFileAsync(imageurl, "Example.exe");
            System.Threading.Thread.Sleep(1000);
            System.Diagnostics.Process.Start("Example.exe");
            System.Threading.Thread.Sleep(1000);
        }

下载工作正常,如果我注释掉 wc.DownloadFileAsync(imageurl, "Example.exe"); 程序将运行。

【问题讨论】:

  • 该文件正在被另一个进程使用。它就在那里用黑白色写着。我假设您在尝试覆盖它的同时运行Example.exe
  • 没有。正如我所说,没有什么是读/写或以任何方式监控这个程序。如果我要评论 wc.DownloadFileAsync(imageurl, "Example.exe"); 它将完美运行。我很确定这与此有关。
  • 使用Process Explorer 找出正在使用Example.exe 的内容。错误消息不是红鲱鱼。当您注释掉该行时它会起作用,因为您不再尝试使用 DownloadFileAsync 方法写入文件,因此没有机会发现该文件已在使用中!
  • 顺便说一句,如果这还不是很清楚:如果 Example.exe 是系统上正在运行的进程,Windows 将阻止写入 Example.exe。
  • 约翰 85 感谢您的建议。我让程序等待了很长一段时间,它修复了它。

标签: c# win32exception


【解决方案1】:

代码有问题。首先它使用 DownloadFileAsync (如它所说)在后台下载。该代码没有得到文件已下载的任何确认 - 它只是休眠 1 秒并“希望”有足够的时间下载文件。

代码确实注册了一个 FileDownloadComplete 回调,但您没有在示例中包含该回调的代码;它很可能是您错误的根源。你能发布完整的例子吗?

因为当您注释掉 DownloadFileAsync 时,您说您的程序运行良好,您的磁盘上必须已经有一个 Example.exe 的副本。 DownloadFileAsync 将覆盖现有文件 - 但前提是它未锁定。发生的事情是 1 秒的睡眠时间不足以完成下载;然后您的程序启动现有的 Example.exe 并将其锁定,然后 DownloadFileAsync 完成并尝试将临时下载的文件复制到您已在运行并处于锁定状态的现有 Example.exe 的顶部。

【讨论】:

    【解决方案2】:

    Example.exe 正在被写入。要停止错误,请让程序等待 Example.exe 完成下载。

    【讨论】:

    • 不——这是一种不正确的方法——你不应该只是“等待更长时间”,而是等到事件处理程序 AsyncCompletedDownloadEventHandler 调用你的代码告诉你它已完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多