Как снять блокировку файлов/папок после использования Directory.GetFiles?

Я использую 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 и удаляю весь объект, но файл остается заблокированным.


person user3561694    schedule 26.05.2014    source источник
comment
+1. У вас не должно быть замков. Чтение никогда не вызывает блокировки, только запись. Можете ли вы попытаться придумать сокращенный тестовый пример, который вы можете опубликовать здесь? Как 5 файлов в 3 файлах, вызывающих ту же проблему.   -  person Neolisk    schedule 27.05.2014
comment
Что вы делаете с файлами после того, как у вас есть имена? Я не могу воспроизвести проблему - я использовал код, который вы разместили, для получения имен, затем я прочитал содержимое нескольких из них, и все сработало хорошо.   -  person keenthinker    schedule 27.05.2014
comment
Я обновил свой вопрос с соответствующей информацией.   -  person user3561694    schedule 27.05.2014
comment
Используете ли вы антивирусное программное обеспечение? Если это так, попробуйте отключить его, так как он иногда держит дескрипторы открытыми для в то время как после того, как вы получили к нему доступ.   -  person Basic    schedule 27.05.2014


Ответы (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)
person Bradley Uffner    schedule 26.05.2014
comment
Спасибо. Теперь это работает как шарм. Я бы так сильно нажал на эту кнопку, если бы у меня было достаточно репутации! - person user3561694; 27.05.2014
comment
FileSteam.Close() msdn.microsoft.com/en-us /library/aa328800%28v=vs.71%29.aspx или оператор Using: msdn.microsoft.com/en-us/library/htd05whh.aspx, iDisposable: msdn.microsoft.com/en-ca/library/system.idisposable.aspx да, вы их используете. тогда что-то еще не так :\ о да... вам не нужно вызывать и Close(), и Dispose(). одного достаточно. - person porkchop; 28.05.2014