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

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

即使有,也不会对你有好处,因为你仍然必须捕获exception,以便处理在初始检查和你打开/访问它的实际尝试之间文件变得不可用的竞争条件。

对于初步的防守检查,我想不出任何令人信服的优势。 它只会导致不必要的代码重复。

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

我是否可以测试是否可以打开文件而不尝试打开它?

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

避免尝试catch(但暗示尝试打开)的有趣方法是LockFile()或CreateFile()函数:

处理WINAPI CreateFile(…)

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

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


BOOL WINAPI LockFile(…)

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

如果函数失败,则返回值为零(FALSE)。 要获取扩展错误信息,请调用GetLastError 。

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

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

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