6

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オブジェクト全体を閉じて破棄していますが、ファイルはロックされたままです。

4

1 に答える 1

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)

最初の行は新しいファイル ストリーム インスタンスを作成し、それを使用する前に、2 行目で新しいインスタンスを作成し、破棄せずに元のインスタンスを破棄します。

これらの行の 1 つだけが必要です。

私はお勧め:

Dim f As New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
于 2014-05-26T21:12:48.073 に答える