在没有Try Catch的情况下检查文件锁定

时间:2009-02-13 22:29:30

标签: c# .net vb.net file-io

是否有更好的方法来检查文件是否未锁定,然后打开文件以捕获异常。我有一个在目录上运行的filewatcher,我需要在文件在该位置完全移动/创建后对该文件执行某些操作。是不是会因性能受到影响而抛出异常?还有更好的方法吗?

Private Function FileAvailable(ByVal fileName As String) As Boolean
    Try
        Using inputStream As FileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)
            Return True
        End Using
    Catch ex As IOException
        Return False
    End Try
End Function

private bool FileAvailable(string fileName) { 
try { 
    using (FileStream inputStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) { 
        return true; 
    } 
} 
catch (IOException ex) { 
    return false; 
} 

}

一位小专家就最佳方式提出建议。感谢

该文件正被复制到watch目录中。没有其他用户可以访问该目录。我只需要验证文件是否完全复制到我处理的目录中并自行移动文件。我需要独家访问它。

2 个答案:

答案 0 :(得分:8)

你多久会这样做?把它放在上下文中,假设您每50毫秒检查一次 - 这是非常频繁的。我的笔记本电脑(我上次检查过)能够超过100个异常每毫秒 ...因此抛出异常的成本将低于总时间的0.02% - 并且假设它始终是忙!

现在,有一个API来避免这种情况肯定会很好 - 一种TryOpenFile - 但在它缺席的情况下,我只是把它放在另一个函数中而不用担心。

但请记住,如果你只是返回一个布尔值,那么你的数据一旦返回就会陈旧 - 另一个进程可以在你返回“它没关系”后立即获取一个独占锁。为避免这种情况,您应该考虑返回开放流。

答案 1 :(得分:1)

Mutex怎么样?