12

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

4

4 回答 4

15

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

我想不出初步防御检查有什么令人信服的优势。它只会导致不必要的代码重复。

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

于 2013-03-12T13:26:51.913 回答
2

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

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

于 2013-03-12T14:14:42.237 回答
1

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

处理 WINAPI CreateFile(...)

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

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


BOOL WINAPI LockFile(...)

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

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

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

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

于 2013-03-13T07:13:48.510 回答
0

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

于 2013-08-05T18:02:48.663 回答