C# 进程终止后,文件保持打开状态

C# 进程终止后,文件保持打开状态,c#,file-io,process,C#,File Io,Process,我的代码去掉了一些不必要的部分,如下所示: using (Process p = new Process()() { p.StartInfo.FileName = batfile; p.StartInfo.Arguments = @"""" + filename + @""""; p.Start(); if (!p.WaitForExit(timeout)) { p.Kill(); if (!p.WaitForExit(ti

我的代码去掉了一些不必要的部分,如下所示:

using (Process p = new Process()()
{
    p.StartInfo.FileName = batfile;
    p.StartInfo.Arguments = @"""" + filename + @"""";
    p.Start();
    if (!p.WaitForExit(timeout))
    {
        p.Kill();
        if (!p.WaitForExit(timeout))
        {
            return failure;
        }
    }
}
File.Delete(filename);

return success;
因此,我创建了一个进程来执行一个.bat文件,将.bat文件的文件名传递给进程,然后启动进程,等待它终止,然后删除它刚刚处理的文件。通常情况下,这很好用

但是有时候,.bat文件中发生的事情会挂起,我必须终止该进程才能恢复。发生这种情况时,File.Delete()抛出一个异常“进程无法访问文件‘filename’,因为它正被另一个进程使用”

考虑到可能我只需要等待一点,我在文件.Delete()之前放置了一个线程.Sleep()几秒钟-我已将睡眠时间增加到30秒,但仍然看到异常。一个进程死后,打开的手柄肯定不会挂在那里那么久吗


如何修复或解决此问题

进程有一个事件,您是否尝试删除此进程中的文件?是-我添加了“if(p.HasExited)”并尝试在该进程中删除-结果相同。但我不需要它-WaitForExit()返回true,所以它一定已经退出了。编辑-抱歉,误读了您的评论,并认为您的意思是HasExit属性。尚未查看退出的事件。您已杀死cmd.exe,这是解释.bat文件的命令处理器。您没有杀死由.bat文件中的命令启动的程序。所以这是完全正常的。我强烈怀疑其他进程会打开文件句柄,不,刚才终止的进程,我建议您查找哪个进程正在锁定文件。有工具可供使用。没有其他进程打开该文件-我知道这是真的。