在尝试打开文件进行阅读之前,是否有任何方法可以先测试文件是否正在使用?例如,如果文件仍在写入或被认为正在使用中,此代码块将抛出异常:
try
{
FileStream stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (IOException ex)
{
// ex.Message == "The process cannot access the file 'XYZ' because it is being used by another process."
}
我环顾四周,我能找到的最好的方法是在内部使用 try catch 执行某种轮询,这感觉非常 hacky。我希望 System.IO.FileInfo
上有一些东西,但没有。
有更好的方法吗?
最佳答案
“您可以直接通过 P/Invoke 层调用 LockFile API 函数。您可以使用 FileStream 上的 SafeFileHandle 属性返回的句柄。 直接调用 API 将允许您检查错误条件的返回值,而不是求助于捕获异常。”
“try/catch block 是正确的解决方案(尽管您想捕获 IOException,而不是所有异常)。您无法正确同步,因为测试锁 + 获取锁不是原子操作。”
“请记住,文件系统是易变的:仅仅因为您的文件在一次操作中处于一种状态并不意味着它在下一次操作中将处于相同状态。您必须能够处理来自文件系统的异常。”
关于c# - 如何检查文件是否正在使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1314958/