2011-09-01 58 views
1

为了避免这样的例外测试文件的可访问性

(1),因为它是由另一个进程

我用下面的方法来测试的文件之前任何可访问过程不能访问该文件进一步处理。

private bool CheckIfFileBeingUsed(string FilePath) 
    { 
     FileStream Fs = null; 
     try 
     { 
      Fs = File.Open(FilePath, FileMode.Open, FileAccess.Read, FileShare.None); 
      Fs.Close(); 
     } 
     catch (Exception) 
     { 
      return true; //Error File is being used 
     } 
     return false; //File is not being used. 
    } 

谁能告诉我有任何的Windows API或其他解决方案文件可访问的,而不是上述File.Open法这样的测试?

+0

相关:http://stackoverflow.com/questions/1304/how-to-check-for-file-lock-in-c – Daniel

+1

术语困惑:要检查文件是否已被锁定,但通常“无障碍“将指您是否拥有使用该文件的访问权限。 – Richard

+0

亲爱的主席先生,会得到文件的属性导致访问/读取文件?如果文件没有准备好,那会导致异常? – Derek

回答

6

这似乎是你在这里重复努力。由于试图打开文件进行处理会抛出同样的异常,为什么不继续尝试处理文件,并在出现异常时处理异常?

假设是不可能出于某种原因,检测这样还不是完全可靠的,因为你现在有一个竞争条件。即使此测试通过,也无法保证当您在文件上运行其他代码时文件将处于相同状态。这就是为什么只是试图做你想做的事情并且在那个时候处理任何异常情况的原因。

+0

不能再认同了! –

+0

我的处理将尝试使用FileInfo类获取文件的属性,但会导致上述异常。这就是为什么我在寻找文件属性之前要进行检查的原因。 – Derek

+1

@Derek我仍然认为这个观点的立场;如果从检查文件中得到异常,则处理该异常,而不是尝试测试新异常。有没有理由不适合你? – dlev

0

你的方法似乎对我有效。不要忘记关闭的情况下,该流的异常,但:

finally 
    { 
     if (Fs!= null) 
      Fs.Close(); 
    } 

请记住,没有100%的保证,这将阻止“文件正在使用”例外。在您的检查和实际打开文件之间总是有一段很短的时间(ms),其中文件可能会被另一个进程使用。

+1

这里使用''使用'块是惯用的。 – Richard

1

这是什么检查摆在首位的目的是什么?您试图通过提前发生并捕获异常来避免异常,但为什么不用目前的设计来捕捉它呢?此外,这种方法受到竞争条件的限制,因为文件在检查后可能变得不可访问,所以唯一正确的方法就是只进行所需的处理并捕获抛出的异常。

+0

我的处理设计会尝试使用FileInfo类获取文件的属性,但会导致上述异常。这就是为什么我在寻找文件属性之前要进行检查的原因。 – Derek

+1

因此,您可以在CheckIfFileBeingUsed中捕获异常,为什么在使用FileInfo时无法执行此操作?无论如何,再次,检查是没用的,并不会解决你的问题。唯一的办法就是在阅读文件属性时处理这个异常。 –

+0

亲爱的主席先生,会得到导致访问/读取文件的文件属性?如果文件没有准备好,那会导致异常? – Derek

0

至于你处理检查文件是否存在明确的,这个方法是好的。你的方法返回true即使File Doesn't Exist

我不认为C#提供任何API这一点。