0

这是交易。

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

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

4

4 回答 4

2

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

您可以尝试在ProcessStartInfoUseShellExecute中设置为 true ,或直接 P/Invoke 到.CreateProcess

于 2008-12-18T16:03:08.167 回答
0

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

于 2008-12-18T15:27:19.160 回答
0

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

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

于 2008-12-18T15:28:34.307 回答
0

当我试图读取一个被独占锁定的文件时,我遇到了类似的问题。

我试图这样做:

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

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

文件被另一个进程独占锁定 - MSDN 论坛讨论

希望这可以帮助。

于 2008-12-18T16:15:02.557 回答