Мое приложение C # блокирует файл, как я могу найти, где оно это делает? - PullRequest
4 голосов
/ 14 сентября 2010

Я пишу код, который проверяет путь к файлу, вычисляет хеш (SHA1) и копирует их. Я убедился, что я не блокирую их, например, используя

public static string SHA1(string filePath)
    {
        var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
        var formatted = string.Empty;
        using (var sha1 = new SHA1Managed())
        {
            byte[] hash = sha1.ComputeHash(fs);
            foreach (byte b in hash)
            {
                formatted += b.ToString("X2");
            }
        }
        return formatted;
    }

Так как я могу в Visual Studio найти, где он блокирует файл?

Ответы [ 4 ]

15 голосов
/ 14 сентября 2010

Можете ли вы сохранить приведенный выше синтаксис как и попробовать?

using(var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
//Your code goes here.
} 
4 голосов
/ 14 сентября 2010

Есть небольшая программа для Windows: Process Explorer, в которой вы можете найти, какой процесс имеет дескриптор файла:

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

3 голосов
/ 14 сентября 2010

Блокировка обычно происходит всякий раз, когда вы создаете файловый поток для файла без последующего закрытия этого потока. Если вы не вызовете fs.Close(); в своем коде, ваше приложение будет держать файл открытым (и, следовательно, заблокированным).

Вы можете заключить это в блок try-finally или попробовать код, который разместил Шива Гопал.

1 голос
/ 14 сентября 2010

Вы предполагаете, что открытие файлового потока с помощью FileAccess.Read не заблокирует файл; файл заблокирован, когда он был открыт для файловой операции и не был закрыт.

A FileStream не закрывает открытый файл до тех пор, пока FileStream не соберет мусор или вы явно не вызовете его метод Close или Dispose. Либо вставьте такой явный вызов, как только вы закончите с файлом, который вы открыли, или оберните использование FileStream в оператор using, который подразумевает вызов Dispose, как предлагают другие ответы.

...