Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待文件关闭的好方法_C#_.net_File - Fatal编程技术网

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);
    }
}