Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Зависание при чтении файла


Автор: fire64 28.7.2013, 19:43
Всегда писал на C++ но сейчас вынужден работать с исходниками готового софта на C#
Столкнулся со страным поведеннием кода:

Код

    public string Get(string FilePath)
    {
        Crc32 crc32 = new Crc32();
        String hash = String.Empty;

        using (FileStream fs = File.Open(FilePath, FileMode.Open))
            foreach (byte b in crc32.ComputeHash(fs)) hash += b.ToString("x2").ToLower();

         return hash;
    }


При попытке чтения некоторых файлов, через  File.Open проихсодит зависание.

Если же использовать, не File.Open, а FileStream, то все ок.

Код

    public string Get(string FilePath)
    {
        Crc32 crc32 = new Crc32();
        String hash = String.Empty;

        FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
            foreach (byte b in crc32.ComputeHash(fs)) hash += b.ToString("x2").ToLower();

        return hash;
    }



При этом файл реально существует.

Автор: fire64 28.7.2013, 20:33
гм, разобрался.
Оказалось, что если файл только для чтения, то File.Open без явного указания возмоных типов операций, приводит к зависанию.

Автор: gambit 29.7.2013, 12:38
Код

public string Get(string FilePath)
    {
        Crc32 crc32 = new Crc32();
        String hash = String.Empty;

        FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
            foreach (byte b in crc32.ComputeHash(fs)) hash += b.ToString("x2").ToLower();

        return hash;
    }


поток необходимо закрыть или завернуть в using.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)