我有一个大问题,无法解决。我正在工作一个更新软件,即使在有运行进程的计算机上也需要工作。因此,如果复制或其他处理导致异常,我需要终止导致错误的进程,然后重试并继续更新。问题是我杀死了这些进程,但窗口继续对我说,即使我杀死了一些进程,也会打开一些进程。
所以我有一种方法,可以在运行进程的计算机上复制更新文件。我使用Process.GetProcessesByName("processName")和下面的解决方案来终止进程。
使用C#,如何找出锁定文件的进程?
这是我的代码:
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文件的进程后被锁定,并且它没有被锁定:
有没有办法检查文件是否正在使用?
请帮帮我。感谢
我认为你有一个种族条件。Kill方法异步退出;调用WaitForExit方法,等待它退出后再继续。如果这些进程有UI,你也可以考虑CloseMainWindow方法,这是一种更"有序"的关闭程序的方式(但调用可能会失败,例如程序可能拒绝关闭,所以你必须检查调用是否成功)。
好的,我发现了这个问题,但我需要有人帮我解决。在我的工作中,有几个由计算机组成的模拟器。我需要终止所有计算机上的进程。那么,如果我知道计算机已插上电源并能一起工作,如何列出所有计算机的进程呢?
这意味着文件共享被访问并保持文件打开。文件共享文件句柄归内核所有。你根本无法关闭它们。流程查找逻辑在此不起作用/不适用。
您需要确保文件共享的客户端停止访问该共享。或者,您可以删除共享或踢出所有当前连接的客户端。我认为取消份额是最好的选择,因为它是无种族条件的,不依赖于扼杀什么。
那么,如果我知道计算机已插上电源并能一起工作,如何列出所有计算机的进程呢?
这是一个不同的问题。这应该已经记录在网上了。