【问题标题】:How to delete a file used by other process如何删除其他进程使用的文件
【发布时间】:2008-12-18 15:15:03
【问题描述】:

这是交易。

我的 WinApp 正在运行,对吗?假设进程“A”。它创建一个文件并保持句柄(保持文件打开以进行写入,这是必须的)。
然后它开始其他 msbuild 过程,我们称之为“B”。此过程从 System.Diagnostic.Process 类开始。
在某些时候,我的 WinApp (A) 需要删除之前创建的文件(记住它是由 A 自己创建的),这时我收到 IOException 并显示消息“进程无法访问文件'X',因为它正在被另一个进程使用”。它实际上是!...如果我终止进程'B',只有'A'才能成功删除文件。

所以我的问题是:
1) 有没有办法告诉我创建的进程不是没有处理我打开的文件?
2)还有其他方法可以实现我的方案吗?

【问题讨论】:

    标签: .net process io winapp


    【解决方案1】:

    看起来System.Diagnostic.Process.Start 调用CreateProcess 并将bInheritHandles 参数设置为true

    您可以尝试在ProcessStartInfo 中将UseShellExecute 设置为true,或者直接P/Invoke 到CreateProcess

    【讨论】:

    • 我真的很喜欢这个建议,但不幸的是没有用...我不知道为什么 B 保留由 A 创建的文件的句柄
    • 实际上,我需要将 UseShellExecute 设置为 false 以重定向我的输出...我想从 .net 框架标准类中无法做到这一点。
    • B 正在“保留” A 的文件句柄,因为该句柄是由于调用 CreateProcess 的方式而被继承的。您可以看一下 System.Diagnostics.Process(或使用框架源代码),以了解 P/Invoke to CreateProcess 所涉及的内容。
    【解决方案2】:

    可以在不关闭正在使用该句柄的进程的情况下强制关闭文件句柄,但这可能会导致应用程序崩溃。换句话说,做你想做的事情可能会导致'B'崩溃。也就是说,您所要求的绝对是可能的,因为应用程序 Process Explorer 可以做到这一点。如果您在该链接中搜索留言板,您可能会发现它提供了丰富的信息,尽管即使是查找哪个应用程序正在使用句柄的行为也是一种令人沮丧的练习,更不用说实际关闭句柄了。

    【讨论】:

      【解决方案3】:

      我不知道删除带有打开句柄的文件的保证方法,但如果您可以等到系统重新启动才能删除文件,您可以使用与 Sysinternals 的 MoveFile 实用程序相同的技术.

      此程序将注册表值添加到 Windows 在启动时检查的 HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations 键,这将保证文件被删除,尽管不是立即删除。

      【讨论】:

        【解决方案4】:

        我在尝试读取被独占锁定的文件时遇到了类似的问题。

        我正在尝试使用:

        FileStream exclusiveWriter = new FileStream(@"C:\Temp\FileLockTest1.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);  
        

        完整的讨论见:

        File exclusively locked by another process - MSDN Forum disucssion

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          • 2020-05-23
          • 2011-03-20
          • 2018-08-12
          • 2019-05-10
          相关资源
          最近更新 更多