如何删除其他进程使用的文件

时间:2008-12-18 15:15:04

标签: .net process io winapp

这是交易。

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

当我尝试读取一个完全锁定的文件时,我遇到了类似的问题。

我试图使用:

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

完整的讨论可在以下网址获得:

File exclusively locked by another process - MSDN Forum disucssion

希望这有帮助。