【问题标题】:Check For File Lock Without A Try Catch在没有尝试捕获的情况下检查文件锁定
【发布时间】:2009-02-13 22:29:30
【问题描述】:

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

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; 
} 

}

一位专家就最佳方法提出建议。谢谢

文件正在被复制到监视目录中。没有其他用户可以访问该目录。在我自己处理和移动文件之前,我只需要验证文件是否已完全复制到目录中。我需要独占访问权限。

【问题讨论】:

  • 您必须定义“我需要对文件做些什么”的意思。不同的操作意味着不同的访问权限、共享权限……
  • 正在将文件复制到监视目录中。没有其他用户可以访问该目录。在我自己处理和移动文件之前,我只需要验证文件是否已完全复制到目录中。我需要独占访问权限。

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


【解决方案1】:

您打算多久执行一次此操作?把它放在上下文中,假设你每 50 毫秒检查一次——这是相当频繁的。我的笔记本电脑(我上次检查时)能够每毫秒抛出 100 多个异常......因此抛出异常的成本将低于总时间的 0.02% - 这是假设它总是忙!

现在,如果有一个 API 来避免这种情况当然会很好 - 类似于 TryOpenFile - 但如果没有它,我只会把它藏在另一个函数中,不用担心。

但是请记住,如果您只是返回一个布尔值,那么您的数据一旦返回就已经过时了 - 一旦您返回“没关系”,另一个进程可能会获取排他锁。为避免这种情况,您应该考虑返回打开的流。

【讨论】:

  • 竞争条件 Jon 提到男人无论如何你都必须这样做,所以如果消费者不想知道要处理哪些异常,只需直接使用 TryOpenFile 进行操作(这是犯罪IOException模型的错误,应该有FileLockedException)
【解决方案2】:

Mutex 呢?

【讨论】:

    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多