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

问题描述:

这是交易。如何删除其他进程使用的文件

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

所以我的问题是:
1)有没有一种方法可以告诉我创建的过程,而不是处理我打开的文件?
2)是否有另一种方法来实现我的场景?

看起来像System.Diagnostic.Process.Start调用CreateProcessbInheritHandles参数设置为true

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

+0

我真的很喜欢这个建议,但不幸的是不工作......我不知道为什么B保持由A – sebagomez 2008-12-18 18:24:47

可以强制关闭文件句柄而不关闭进程正在使用的句柄,尽管这可能会导致应用程序崩溃。换句话说,做你想做的事情可能会导致'B'崩溃。也就是说,你所要求的肯定是可能的,因为应用程序Process Explorer可以做到这一点。我在那个链接中搜索消息板,你可能会发现它的信息量很大,但即使是找到的行为哪个应用程序正在使用一个句柄,这是一个沮丧的练习,不必介意真正关闭句柄。

我不知道如何保证删除打开句柄的文件,但是如果您可以等待系统重新启动以删除文件,则可以使用Sysinternals的MoveFile实用程序的相同技术。

这个程序添加注册表值到HKLM \系统\ CurrentControlSet \控制\会话管理器\的PendingFileRenameOperations关键的Windows会检查启动,这将确保该文件被删除,虽然不是马上。

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

我试图用做:

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

完整的讨论,请访问:

File exclusively locked by another process - MSDN Forum disucssion

希望这有助于。