I'm using IO.Directory.GetFiles
to search for files in a folder. After the searching is done, I can't use files in this folder until my application is closed. I haven't found any Dispose
functions in DirectoryInfo
class, so my question is: How can I release or unlock these files?
My code:
Dim list = IO.Directory.GetFiles(folder, "*.*", IO.SearchOption.AllDirectories)
EDIT:
I have examined my code once again very carefully (I couldn't reproduce my problem in another project) and it turned out that this function is locking the files:
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
It's strange. I'm closing the FileStream
and disposing the whole object but file remains locked.
You are opening 2 seperate streams, then only closing the last one.
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)
The first line creates a new filestream instance then, before it can be used, the 2nd line creates a NEW instance and throws out the original one without disposing it.
You should only need one of these lines.
I recommend:
Dim f As New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With