C# 等待文件关闭的好方法
可能重复:C# 等待文件关闭的好方法,c#,.net,file,C#,.net,File,可能重复: 我有一个打开的文件,比如.Doc或.txt,我必须等到用户关闭它。 我已经试过了,根据: 这很好,但是不需要try/catch和异常处理程序就可以找到解决方案 不幸的是,没有别的办法 API没有在文件处于解锁状态或任何其他方便的情况下触发的事件 使用等待重试是当前API的最佳解决方案。但是,首先,不要使用您现在拥有的循环,如果没有异常,请中断ing-使用循环在该中执行实际的文件访问 接下来,如果文件在已知进程中打开,则可以获取其进程对象,将EnableRaisingEvents设置
我有一个打开的文件,比如.Doc或.txt,我必须等到用户关闭它。 我已经试过了,根据:
这很好,但是不需要try/catch和异常处理程序就可以找到解决方案 不幸的是,没有别的办法 API没有在文件处于解锁状态或任何其他方便的情况下触发的事件
使用等待重试是当前API的最佳解决方案。但是,首先,不要使用您现在拥有的循环,如果没有异常,请中断ing-使用循环在该
中执行实际的文件访问
接下来,如果文件在已知进程中打开,则可以获取其进程
对象,将EnableRaisingEvents
设置为true
,并处理其退出的事件以重试。但它不是故障保护,所以您仍然可以处理异常并使用循环。您可以对本机CreateFile函数进行p/Invoke调用,然后分析错误代码。但是,try/catch仍然是必要的。这是一个非常好的问题。不幸的是,一般来说,你不能回答。已经有一个问题了——你甚至发布了一个链接——所以如果这是答案,那就是答案。不过,这真的太糟糕了,没有一个干净的方法。请注意,您有两个问题,一个是“当用户处理完文件时”和“当文件不再锁定时”。第二部分是另一个问题的完全重复,第一部分不是所有文件类型/应用程序对都可以解决的(即,如果像Visual Studion这样的应用程序打开了一个文件,并且不锁定它,而是让用户在需要时保存)。对于重复的问题,我很抱歉,但感谢您的评论和回答。现在我对这个概念有了更多的了解。尽管您可能完全正确,但我仍然想知道Mark Russinovich的Process Explorer是如何几乎实时地显示流程的开放句柄的。它是否也通过频繁的投票来做到这一点?我会设法弄明白这一点,如果我发现一些有用的东西,我会在这里发布我的答案。@Igor-他没有使用托管代码。我不知道windows API公开了什么(他可能正在使用未记录的功能)。当然Mark使用的是低级非托管API(甚至是动态加载内核驱动程序!),但OP dind并没有说必须只使用托管API来解决问题。如何不用等待和循环的方法来实现这一点对我来说非常有趣(我敢打赌,对许多其他人来说也是如此)。您可以使用Restart Manager API来查找哪些进程正在锁定特定文件:但我认为它不允许监视文件锁定状态。
while (true)
{
try
{
using (FileStream Fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None, 100))
{
//the file is close
break;
}
}
catch (IOException)
{
//wait and retry
Thread.Sleep(1000);
}
}