在尝试打开文件进行阅读之前,有没有办法首先测试文件是否正在使用?例如,如果文件仍在写入或被认为正在使用中,则此代码块将引发异常:
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
上有一些东西,但没有。
有关更好方法的任何想法吗?
答案 0 :(得分:4)
“您可以直接通过P / Invoke层调用LockFile API函数。您将使用FileStream上SafeFileHandle属性返回的句柄。 直接调用API将允许您检查错误条件的返回值,而不是诉诸捕获异常。“
“ try / catch块是CORRECT解决方案(虽然你想捕获IOException,而不是所有异常)。你无法正确同步,因为测试锁+获取锁不是原子操作。“
“请记住,文件系统是易失性的:只是因为您的文件处于一种状态进行一次操作并不意味着它将处于下一次操作的相同状态。您必须能够处理来自文件系统的异常。“
答案 1 :(得分:0)
尝试执行此操作的函数只需尝试捕获循环。就像数据库一样,找出你可以做某事的最好方法就是尝试去做。如果失败,请处理它。除非您的线程代码已关闭,否则您的程序没有理由不能打开文件,除非用户在其他程序中打开它。
除非你在做有趣的事情。