Я пытаюсь открыть файл на С#, затем написать в него текст и завершить сжатием массива байтов в тот же файл. Итак, файл, который я хочу создать, выглядит примерно так:
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
, код будет работать нормально. Итак, у меня два вопроса:
StreamWriter
file
, когда тот закрывается сам?По умолчанию StreamWriter
закрывает цель Stream
при удалении, что означает, что она больше не сообщается как доступная для записи, поэтому и отображается эта ошибка. Вы можете исправить это, используя конструктор, который принимает необязательный bool
:
using (StreamWriter writer = new(file, leaveOpen: true))
Однако мне интересно, не проще ли просто не использовать StreamWriter
и напрямую обращаться к логике Encoding
.
Обратите внимание, что нет особого смысла записывать подобные префиксные данные перед GZipStream
в том же файле, если только вы также не собираетесь разворачивать их вручную при чтении; в противном случае это больше не будет допустимой полезной нагрузкой gzip.
Ммм, я предпочитаю использовать писатель, на мой взгляд, это делает код чище. Но я согласен, что это субъективный выбор.
И да, я знаю, что мне тоже нужно развернуть вручную. На самом деле я пишу файл .nrrd такого формата.
@5xum по поводу формата: отлично, без проблем; ТИЛ; Однако есть одна вещь, на которую стоит обратить внимание: окончания строк — Linux vs Windows и т. д.; легче сделать это правильно (т. е. то, что ожидает формат, а не то, что ожидает ОС), если вы делаете это вручную
Кстати, ответ именно тот, что мне был нужен, так что спасибо. Скоро приму, система пока это запрещает :)
Первый вопрос , второй вопрос .