Запись в один и тот же файл с помощью двух операторов using и двух операторов записи

Я пытаюсь открыть файл на С#, затем написать в него текст и завершить сжатием массива байтов в тот же файл. Итак, файл, который я хочу создать, выглядит примерно так:

sometextinascii
somemoretextinascii
BUNCHOFNONHUMANREADABLEBYTES

и я сделал следующее:


// Code where we get values of the following variables:
// string filename
// Byte[] buffer
using (FileStream file = new(filename, FileMode.Create, FileAccess.Write))
{
    using (StreamWriter writer = new(file))
    {
        writer.WriteLine("sometext");
        writer.WriteLine("somemoretext");
    }
    using (GZipStream zipStream = new(file, CompressionMode.Compress))
    {
        zipStream.Write(buffer, 0, buffer.Length);
    }
}

но это не работает. Когда я запускаю этот код, я получаю ошибку

System.ArgumentException: 'Stream does not support writing. (Parameter 'stream')'

когда создается переменная zipStream.

Чего я не понимаю, так это того, что если я удалю часть кода StreamWriter, код будет работать нормально. Итак, у меня два вопроса:

  1. Закрывает ли StreamWriterfile, когда тот закрывается сам?
  2. Если да, то как я могу это предотвратить? Если нет, то в чем причина моей ошибки?

Первый вопрос , второй вопрос .

Sinatr 02.08.2024 12:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По умолчанию StreamWriter закрывает цель Stream при удалении, что означает, что она больше не сообщается как доступная для записи, поэтому и отображается эта ошибка. Вы можете исправить это, используя конструктор, который принимает необязательный bool:

using (StreamWriter writer = new(file, leaveOpen: true))

Однако мне интересно, не проще ли просто не использовать StreamWriter и напрямую обращаться к логике Encoding.

Обратите внимание, что нет особого смысла записывать подобные префиксные данные перед GZipStream в том же файле, если только вы также не собираетесь разворачивать их вручную при чтении; в противном случае это больше не будет допустимой полезной нагрузкой gzip.

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

5xum 02.08.2024 12:03

И да, я знаю, что мне тоже нужно развернуть вручную. На самом деле я пишу файл .nrrd такого формата.

5xum 02.08.2024 12:03

@5xum по поводу формата: отлично, без проблем; ТИЛ; Однако есть одна вещь, на которую стоит обратить внимание: окончания строк — Linux vs Windows и т. д.; легче сделать это правильно (т. е. то, что ожидает формат, а не то, что ожидает ОС), если вы делаете это вручную

Marc Gravell 02.08.2024 12:04

Кстати, ответ именно тот, что мне был нужен, так что спасибо. Скоро приму, система пока это запрещает :)

5xum 02.08.2024 12:05

Другие вопросы по теме

Похожие вопросы