如何关闭来自父进程 C# 的文件句柄

How to close a file handle which came from a parent process C#

我目前正在创建应用程序更新程序模块,但遇到了打开文件句柄的问题。

更新程序模块是一个单独的程序,但当用户单击 'upgrade' 选项时,通过 Process.Start() 更新的应用程序启动。更新程序所做的第一件事就是关闭正在更新的应用程序,以便可以重新安装它而不会出现任何文件访问问题等。

一切都很好,直到我尝试删除正在更新的应用程序的安装目录。我得到一个例外,上面写着:-

该进程无法访问该文件,因为它正被另一个进程使用。

我通过使用 SysInternals Process Explorer 实用程序跟踪了一些事情。更新程序最初是正在更新的应用程序的子进程,但是一旦要更新的应用程序被终止,更新程序就是它自己的父进程。问题似乎是更新程序有一个正在更新的应用程序安装目录的打开文件句柄。

我可以通过在更新程序开始尝试删除安装文件夹之前关闭 Process Explorer 中的文件句柄来手动解决此问题,这样就不会引发异常。但是我需要一些方法在代码中关闭这个文件句柄或者避免文件句柄首先被更新程序进程持有。

我试过使用 WIN32 CreateProcess 方法创建进程而不继承句柄,但安装文件夹的文件句柄仍由更新程序持有。

如有任何建议,我们将不胜感激。

这可能是进程的当前目录。如果您使用安装目录作为当前目录启动记事本,则会出现相同的句柄。然后当您使用记事本中的文件打开对话框导航到其他目录时,句柄消失。

使用 Environment.CurrentDirectory 更改目录或使用更好的当前目录创建子目录。