C# - Освобождение файла

325
26 июня 2017, 17:33

Есть BinaryReader и BinaryWriter, которые одновременно пишут и читают. Есть progressBar. При закрытии приложения во время работы получаю Exception в progressBar и с помощью делегата делаю Close() & Dispose() BinaryReader, BinaryWriter и FileStream, который используется в BinaryReader. Тем не менее файл почему то не освобождается.

streamRead - FileStream; reader - BinaryReader;

using (streamRead = new FileStream(filePath, FileMode.Open))
        {
            reader = new BinaryReader(streamRead);

writer - BinaryWriter

 using (writer = new BinaryWriter(File.Open(this.txbxArchivePath.Text + @"\" + this.txbxArchiveName.Text + ".Haffman", FileMode.Create, FileAccess.ReadWrite, FileShare.Read))){ }

метод, который вызываю с помощью делегата:

private void DisposeAll()
    {
        this.reader.Close();
        this.writer.Close();
        streamRead.Close();
        this.reader.Dispose();
        this.writer.Dispose();
        streamRead.Dispose();
        this.Dispose();
    }
Answer 1

На MSDN пишут:

"Не прерывайте поток, выполняющий операцию чтения. Несмотря на то, что приложение может отображаться для успешного выполнения после поток не заблокирован, прерывания может привести к снижению производительности и надежности приложения." скорее всего это и имелось в виду

Наверняка, это и имелось в виду, что выполнение методов Close() & Dispose() может выполниться некорректно.

Попробуйте такой пример:

 class MyReader
{
    bool _breakReader = false;
    public void Close()
    {
        _breakReader = true;
    }
    public byte[] Read(string file)
    {
        byte[] bytes;
        try
        {
            using (FileStream fsSource = new FileStream(file,
                FileMode.Open, FileAccess.Read))
            {
                bytes = new byte[fsSource.Length];
                //Здесь можно указать нужный буфер 
                int numBytesToRead = 1024*1024; //1 МБ
                int numBytesRead = 0;
                while (numBytesToRead > 0)
                {
                    int n = fsSource.Read(bytes, 
                        numBytesRead, numBytesToRead);
                    // Здесь будет прерывание считывания
                    if (n == 0 || _breakReader )
                        break;
                    numBytesRead += n;
                    numBytesToRead -= n;
                }
                numBytesToRead = bytes.Length;
            }
        }
        catch (FileNotFoundException ioEx)
        {
            Console.WriteLine(ioEx.Message);
        }
        return bytes;
    }
}

В итоге получается, что мы считываем файл по одному мегабайту, если во время считывания флаг изменился на true, то мы прерываем цикл считывания и корректно закрываем FileStream

READ ALSO
Привязка к строке

Привязка к строке

Есть вью модель wpf страницыВ ней указано свойство :

226
Подрезка строки с конца на указанное количество символов в C#

Подрезка строки с конца на указанное количество символов в C#

Существует ли какая-либо функция для этой задачи, или же придется делать вручную? Код работает не правильно!

325
C# создать список объектов из дессериализации дерева объектов JSON

C# создать список объектов из дессериализации дерева объектов JSON

Сразу хочу сказать, что я начинающий разработчик и прошу прощения, если вопрос поставлен не корректноНигде не нашел, как обратится к вложенному...

362