【问题标题】:How can I release locks on files/folders after using Directory.GetFiles?使用 Directory.GetFiles 后如何释放对文件/文件夹的锁定?
【发布时间】:2014-05-26 20:35:09
【问题描述】:

我正在使用IO.Directory.GetFiles 搜索文件夹中的文件。搜索完成后,在我的应用程序关闭之前,我无法使用此文件夹中的文件。我在DirectoryInfo 类中没有找到任何Dispose 函数,所以我的问题是:如何释放或解锁这些文件?

我的代码:

Dim list = IO.Directory.GetFiles(folder, "*.*", IO.SearchOption.AllDirectories)

编辑:

我再次非常仔细地检查了我的代码(我无法在另一个项目中重现我的问题),结果发现这个函数正在锁定文件:

   Public Function ComputeFileHash(ByVal filePath As String)
        Dim md5 As MD5CryptoServiceProvider = New MD5CryptoServiceProvider
        Dim f As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
        f = New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
        md5.ComputeHash(f)
        f.Close()
        f.Dispose()
        Dim hash As Byte() = md5.Hash
        Dim buff As Text.StringBuilder = New Text.StringBuilder
        Dim hashByte As Byte
        For Each hashByte In hash
            buff.Append(String.Format("{0:X2}", hashByte))
        Next
        Dim md5string As String
        md5string = buff.ToString()
        Return md5string
    End Function

这很奇怪。我正在关闭 FileStream 并处理整个对象,但文件仍处于锁定状态。

【问题讨论】:

  • +1。你不应该得到任何锁。读永远不会导致锁,只有写会。你能想出一个简化的测试用例,你可以在这里发布吗?就像 3 个文件中的 5 个文件导致了同样的问题。
  • 获得名称后,您将如何处理这些文件?我无法重现该问题 - 我使用您发布的代码来获取名称,然后我阅读了其中几个的内容并且一切正常。
  • 我已经用相关信息更新了我的问题。
  • 您在使用杀毒软件吗?如果是这样,请在访问后尝试将其禁用为 sometimes keeps handles open 一段时间。

标签: vb.net getfiles filelock


【解决方案1】:

您正在打开 2 个单独的流,然后只关闭最后一个。

 Dim f As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
 f = New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)

第一行创建一个新的文件流实例,然后,在它可以使用之前,第二行创建一个新的实例并丢弃原来的实例而不丢弃它。

你应该只需要这些行之一。

我推荐:

Dim f As New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 2021-09-08
  • 2012-03-08
  • 2018-12-19
  • 2014-12-25
  • 2018-07-18
  • 1970-01-01
  • 2010-11-29
相关资源
最近更新 更多