C# 如何检查文件是否正在使用?

C# 如何检查文件是否正在使用?,c#,filestream,.net,file-access,C#,Filestream,.net,File Access,在试图打开文件进行读取之前,有没有办法先测试文件是否正在使用?例如,如果文件仍在写入或正在使用中,此代码块将引发异常: try { FileStream stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read); } catch (IOException ex) { // ex.Message == "The process cannot access the file 'X

在试图打开文件进行读取之前,有没有办法先测试文件是否正在使用?例如,如果文件仍在写入或正在使用中,此代码块将引发异常:

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."
}
我环顾了四周,我能找到的最好的方法就是在里面进行一次“尝试-捕捉”式的投票,这让我感觉很不舒服。我希望
System.IO.FileInfo
上会有一些东西,但是没有

有更好的方法吗?

“您可以通过p/Invoke层直接调用LockFile API函数。您可以使用FileStream上的SafeFileHandle属性返回的句柄。 直接调用API将允许您检查返回值是否存在错误条件,而不是诉诸于捕获异常。”

try/catch块是正确的解决方案(尽管您希望捕获IOException,而不是所有异常)。无法正确同步,因为测试锁+获取锁不是原子操作

请记住,文件系统是不稳定的:仅仅因为您的文件在一次操作中处于一种状态,并不意味着在下一次操作中它将处于相同的状态。您必须能够处理来自文件系统的异常


一个尝试并执行它的函数只需在循环中尝试catch。就像使用数据库一样,确定您是否可以做某事的最佳方法是尝试并执行它。如果失败了,处理它。除非线程代码关闭,否则程序没有理由不能打开文件,除非用户在另一个程序中打开它


当然,除非你在做有趣的事情。

我在尝试做有趣的事情:)在我的特殊情况下,这些锁可能是长时间运行的锁,我不想为循环中的try-catch付出代价。偶发性是可以的,但它可能比特殊情况更常见。我不太担心它是原子性的。该链接讨论了如何通过P/Invoke进行检查。我在哪里可以找到更多关于它的信息,看看它是否有帮助?@McCamey:检查我刚才添加的第二个链接。由于文件系统更改总是可能的,正确的答案是尝试一下,如果发生异常,就处理它。除此之外,简单地要求它要比跳越铁环去发现它是否在使用要容易得多。