如何删除C#中另一个进程锁定的文件?

Dea*_*tes 54 c# file-locking

我正在寻找一种方法来删除使用C#被另一个进程锁定的文件.我怀疑该方法必须能够找到哪个进程正在锁定文件(可能是通过跟踪句柄,虽然我不知道如何在C#中执行此操作)然后在能够使用完成文件删除之前关闭该进程File.Delete().

Ish*_*eel 36

杀死其他进程并不是一件好事.如果您的方案涉及卸载等操作,则可以使用MoveFileExAPI函数在下次重新引导时将文件标记为删除.

如果您确实需要删除其他进程正在使用的文件,我建议您在考虑任何解决方案之前重新考虑实际问题.

  • 请注意此MSDN备注:`MOVEFILE_DELAY_UNTIL_REBOOT` - "...仅当进程位于属于administrators组或LocalSystem帐户的用户的上下文中时,才能使用此值..." (6认同)

小智 15

典型的方法如下.你说你想用C#做这个,所以这里......

  1. 如果您不知道哪个进程锁定了文件,则需要检查每个进程的句柄列表,并查询每个句柄以确定它是否标识了锁定的文件.在C#中执行此操作可能需要P/Invoke或中间C++/CLI来调用您需要的本机API.
  2. 一旦你弄清楚哪个进程锁定了文件,你就需要安全地将一个小的本机DLL注入到进程中(你也可以注入一个托管的DLL,但这很麻烦,因为你必须开始或附加到.NET运行时).
  3. 然后,该引导DLL使用CloseHandle等关闭句柄.

基本上:解锁"锁定"文件的方法是将DLL文件注入违规进程的地址空间并自行关闭.您可以使用本机代码或托管代码执行此操作.无论如何,你将需要少量的本机代码或至少P/Invoke.

有用的网址:

祝好运!


Ori*_*rds 7

如果你想以编程方式进行.我不确定......我真的建议反对它.如果您只是在自己的机器上进行故障排除,SysInternals Process Explorer可以为您提供帮助

运行它,使用Find Handle命令(我认为它在查找或句柄菜单中),并搜索文件的名称.找到手柄后,您可以强行关闭它们.

然后,您可以删除该文件,依此类推.

注意,这样做可能会导致拥有句柄的程序表现得很奇怪,因为你只是从它下面拉出了众所周知的地毯,但是当你调试自己的错误代码时,或者在visual studio/windows explorer中它运行良好即使你告诉他们关闭文件很久以前就是废话并且没有释放文件句柄...叹气:-)


Rya*_*Fox 5

您可以使用这个程序Handle来查找哪个进程锁定了您的文件。这是一个命令行工具,所以我猜你会使用它的输出。我不确定以编程方式找到它。

如果删除文件可以等待,您可以指定在您的计算机下次启动时将其删除:

  1. 启动REGEDT32 (W2K)REGEDIT (WXP)导航至:

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
    
    Run Code Online (Sandbox Code Playgroud)
  2. W2K 和 WXP

    • W2K:
      编辑
      添加值...
      数据类型:REG_MULTI_SZ
      值名称:PendingFileRenameOperations
      OK

    • WXP:
      编辑
      新的
      多字符串值
      enter
      PendingFileRenameOperations

  3. 在数据区,输入"\??\" + filename要删除。LFN 可以在不嵌入引号的情况下输入。要删除C:\Long Directory Name\Long File Name.exe,请输入以下数据:

    \??\C:\Long Directory Name\Long File Name.exe
    
    Run Code Online (Sandbox Code Playgroud)

    然后按OK

  4. “目标文件名”是一个空(零)字符串。输入如下:

    • W2K:
      编辑
      二进制
      选择数据格式:十六进制
      单击十六进制字符串的末尾
      输入 0000(四个零)
      OK

    • WXP:
      右键单击值
      选择“修改二进制数据”
      单击十六进制字符串的末尾
      输入 0000(四个零)
      OK

  5. 关闭REGEDT32/REGEDIT并重新启动以删除文件。

(为了后人的缘故,无耻地从某个随机论坛偷走。)