这是交易。
我的WinApp正在运行,对吗?让我们说进程'A'。它创建一个文件并保留句柄(保持文件打开以便写入,这是必须的。)
然后它启动其他msbuild进程,让我们称之为'B'。此过程从System.Diagnostic.Process类开始
在某些时候,我的WinApp(A)需要删除以前创建的文件(记住它是由A本身创建的),当我得到一个IOException时,消息“进程无法访问文件'X',因为它正在由另一个进程使用“。它实际上是!...如果我终止进程'B',那么'A'才能成功删除该文件。
所以我的问题是:
1)有没有办法可以告诉我创建的流程并不处理我打开的文件?
2)有没有其他方法可以实现我的方案?
答案 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
希望这有帮助。