有没有一种方法可以检查文件是否正在使用或未被其他进程打开,而不仅仅是尝试打开它并捕获异常?没有服务方法来测试这样的事情吗?
4 回答
即使有,它也不会对您有多大好处,因为您仍然必须捕获异常以处理在您的初始检查和您实际尝试打开/访问它之间文件变得不可用的竞争条件。
我想不出初步防御检查有什么令人信服的优势。它只会导致不必要的代码重复。
如果有这样的IsFileAccessible
函数,它可能会被实现为一个巨大的 try/catch 块,它试图打开文件、捕获失败并返回结果。
我可以测试是否可以在不尝试打开的情况下打开文件吗?
.net 框架,就像下面的 Windows API 一样,不提供这样的功能。如果您想知道一个文件是否可以打开,您应该尝试打开它并检查是否失败。
避免尝试捕获(但意味着尝试打开)的有趣方法是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