有没有一种方法可以检查文件是否正在使用或是否未被其他进程打开,而不仅仅是尝试打开它并捕获异常? 是否没有服务方法来测试这种情况?
有没有一种方法可以检查文件是否正在使用或是否未被其他进程打开,而不仅仅是尝试打开它并捕获异常? 是否没有服务方法来测试这种情况?
OpenFile
函数(或等效函数)只返回指示成功或特定错误条件的错误代码:FileNotFound
,FileInUse
,UnauthorizedAccess
等。@two - Cody Gray我能否在不尝试打开它的情况下测试文件是否可以被打开?
就像底层的Windows API一样,.NET框架也没有提供这样的功能。如果你想知道一个文件是否可以被打开,你需要尝试打开它并检查是否失败。
避免使用try catch的有趣方法(但意味着尝试打开)是使用LockFile()或CreateFile()函数:
HANDLE WINAPI CreateFile(...)
如果函数成功,则返回值是指向指定文件、设备、命名管道或邮件槽的打开句柄。
如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用GetLastError。
BOOL WINAPI LockFile(...)
如果函数成功,返回值为非零(TRUE)。
如果函数失败,返回值为零(FALSE)。要获取扩展错误信息,请调用GetLastError。
这将锁定指定的文件以供调用进程独占访问,并在失败时将错误信息写入线程的上一个错误中,可以使用GetLastError函数检索该信息。
仍有可能在unlockFile和OpenFile之间的时间内另一个进程锁定文件,但可以通过仅在需要打开文件的时刻保持文件被锁定来最小化此时间。
if (FileExists(file)) { OpenFile(file); }
是基本上有缺陷的,因为它没有处理文件在调用FileExists()
和OpenFile()
之间消失的情况。因此,您可能想要尝试打开文件并处理任何错误(无论是来自异常还是返回代码)。我的回答讨论了异常,因为您在问题中应用了标签。 - Cody Gray你可以在 .net 4.5 中实现这个功能,但它会包含很多开销http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx