【问题标题】:How to avoid IOException after killing processes?杀死进程后如何避免IOException?
【发布时间】:2016-07-27 19:50:46
【问题描述】:

我这里有一个大问题,无法解决。我正在开发一个更新软件,即使在运行进程的计算机上也需要工作。所以如果复制或其他处理导致异常,我需要杀死导致错误的进程并重试并继续更新。问题是我杀死了这些进程,但 Windows 继续对我说,即使我杀死了它们,也有一些进程打开。

所以我有一种方法可以在运行进程的计算机上复制更新文件。我使用 Process.GetProcessesByName("processName") 和下面的解决方案来杀死进程。

Using C#, how does one figure out what process locked a file?

这是我的代码:

try
{
    file.CopyTo(destAbsolutePath, true);
}
catch (IOException ioException)
{
    foreach (var process in Process.GetProcessesByName(file.Name.Replace(Path.GetExtension(file.Name), "")))
    {
        process.Kill();
    }
    foreach (Process p in Win32Processes.GetProcessesLockingFile(file.FullName))
    {
        p.Kill();
    }
    file.CopyTo(destAbsolutePath, true);
}

我问我 Windows 是否需要时间来知道进程是否被杀死。我试着等了一会儿,但什么也没发生。如果我在杀死这些进程后关闭我的应用程序并重新打开它,则不会再出现错误。如果我用GetCurrentProcess.Kill() 杀死我的应用程序,错误就会留在那里。我不认为是我的应用程序导致了 IOException,因为我只是在循环 FileInfo 对象。

我尝试了这个解决方案来检查我的文件(我杀死的进程使用的 .dll 自定义文件)在杀死使用我的 .dll 文件的进程后是否被锁定并且它没有被锁定:

Is there a way to check if a file is in use?

请帮帮我。 谢谢

【问题讨论】:

    标签: c# file process ioexception fileinfo


    【解决方案1】:

    我认为你有一个竞争条件。 Kill 方法异步退出;在继续之前调用 WaitForExit 方法等待它退出。如果这些进程有一个 UI,你也可以考虑 CloseMainWindow 方法,它是关闭程序的一种更“有序”的方式(但调用可能会失败 - 例如,程序可能拒绝关闭 - 所以你必须检查是否调用成功)。

    【讨论】:

    • 我试图调用 WaitForExit() 但问题仍然存在。最后,即使我杀死我的应用程序并重新打开它,我也会遇到错误。
    • 哦,我在最后一个错误后 2-3 分钟重试了重新启动我的程序......没有更多错误......这应该是什么问题?
    • 好的,我找到了问题,但我需要有人帮我解决它。在我的工作中,有几台计算机组成的模拟器。我需要杀死所有计算机上的进程。那么如果我知道计算机已插入并协同工作,如何列出所有计算机进程?
    【解决方案2】:

    好的,我找到了问题,但我需要有人帮助我解决它。在我的工作中,有几台计算机组成的模拟器。我需要杀死所有计算机上的进程。那么如果我知道计算机已插入并一起工作,如何列出所有计算机进程?

    这意味着文件共享被访问并保持文件打开。文件共享文件句柄归内核所有。你根本无法关闭它们。流程查找逻辑在这里不起作用/不适用。

    您需要确保文件共享的客户端停止访问该共享。或者,您可以删除共享或踢出所有当前连接的客户端。我认为删除共享是最好的选择,因为它没有竞争条件并且它不依赖于杀死某些东西。

    如果我知道计算机已插入并一起工作,那么如何列出所有计算机进程?

    这是一个不同的问题。这应该已经记录在网络上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2013-07-24
      • 2014-05-27
      相关资源
      最近更新 更多