我这里有一个大问题,无法修复它。我正在开发一个工作中需要在运行流程的计算机上工作的更新软件。因此,如果副本或其他处理导致异常,我需要终止导致错误的过程并重试并继续更新。问题是我杀死了这些进程,但是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?
请帮帮我。 感谢
答案 0 :(得分:0)
我认为你有竞争条件。 Kill方法异步退出;在继续之前调用WaitForExit方法以等待它退出。如果这些进程有一个用户界面,你可能还会考虑使用CloseMainWindow方法,它可以更有条理地进行。关闭程序的方式(但是调用可能会失败 - 例如程序可能拒绝关闭 - 所以你必须检查调用是否成功)。
答案 1 :(得分:0)
好的,我发现了问题,但我需要有人帮我解决。在我的工作中,有几台计算机组成的模拟器。我需要杀死所有计算机上的进程。那么如果我知道计算机已插入并一起工作,如何列出所有计算机进程?
这意味着访问了文件共享并保持文件打开。文件共享文件句柄由内核拥有。你根本无法关闭它们。流程查找逻辑在这里不起作用/适用。
您需要确保文件共享的客户端停止访问共享。或者,您可以删除共享或踢所有当前连接的客户端。我认为删除共享是最好的选择,因为它是免费的竞争条件,它不依赖于杀死某些东西。
那么如果我知道计算机已插入并一起工作,如何列出所有计算机进程?
这是一个不同的问题。这应该在网上记录下来。