使用Directory.GetFiles后,如何释放文件/文件夹上的锁?

时间:2014-05-26 20:35:10

标签: vb.net getfiles filelock

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

我的代码:

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 个答案:

答案 0 :(得分:9)

您正在打开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)