检查文件是否正在使用而不尝试catch?

时间:2013-03-12 13:24:27

标签: c# .net file exception file-access

有没有办法可以检查文件是否正在使用或者是否被其他进程打开而不仅仅是尝试打开它并捕获异常?有没有服务方法来测试这样的事情?

4 个答案:

答案 0 :(得分:15)

即使有,也不会对你有好处,因为你仍然必须抓住异常才能处理在你的初始检查和你打开/访问的实际尝试之间文件变得不可用的竞争条件它

我无法想到初步防守检查有任何令人信服的优势。它只会导致不必要的代码重复。

如果这样的IsFileAccessible函数,它可能会被实现为一个巨大的try / catch块,它试图打开文件,捕获失败并返回结果。< / p>

答案 1 :(得分:2)

  

我可以测试是否可以在不尝试的情况下打开文件   打开它?

.net框架,就像下面的Windows API一样,没有提供这样的功能。如果您想知道文件是否可以打开,您应该尝试打开它并检查是否有失败。

答案 2 :(得分:1)

避免尝试捕获(但意味着尝试打开)的有趣方法是LockFile()CreateFile()函数:

  

处理WINAPI CreateFile(...)

     

如果函数成功,则返回值是指定文件,设备,命名管道或邮件槽的打开句柄。

     

如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获取扩展错误信息,请致电GetLastError


  

BOOL WINAPI LockFile(...)

     

如果函数成功,则返回值为非零   (TRUE)。

     

如果函数失败,则返回值为零(FALSE)。要得到   扩展错误信息,请致电GetLastError

这将锁定指定的文件以供调用进程独占访问,并在失败时将错误信息写入线程的last-error,可以使用GetLastError函数进行检索。

在unlockFile和OpenFile之间仍然可以想到另一个进程可以锁定文件,但是可以通过将文件锁定到需要打开的那一刻来最小化这段时间。

答案 3 :(得分:0)

你可以在.net 4.5中实现这个人,但它包含了很多开销 http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx