Ответ 1
Чтобы проиллюстрировать, отредактируйте свой код
using(var stream = File.Open(newFilename, FileMode.CreateNew))
{
using(var reader = new BinaryReader(file.InputStream))
{
using(var writer = new BinaryWriter(stream))
{
var chunk = new byte[ChunkSize];
Int32 count;
while((count = reader.Read(chunk, 0, ChunkSize)) > 0)
{
writer.Write(chunk, 0, count);
}
} // here we dispose of writer, which disposes of stream
} // here we dispose of reader
} // here we dispose a stream, which was already disposed of by writer
Чтобы этого избежать, просто создайте автора напрямую
using(var reader = new BinaryReader(file.InputStream))
{
using(var writer = new BinaryWriter( File.Open(newFilename, FileMode.CreateNew)))
{
var chunk = new byte[ChunkSize];
Int32 count;
while((count = reader.Read(chunk, 0, ChunkSize)) > 0)
{
writer.Write(chunk, 0, count);
}
} // here we dispose of writer, which disposes of its inner stream
} // here we dispose of reader
edit
: чтобы принять во внимание то, что говорит Эрик Липперт, действительно может быть момент, когда поток будет выпущен только финализатором, если BinaryWriter выбрасывает исключение. Согласно коду BinaryWriter, это может произойти в трех случаях
If (output Is Nothing) Then
Throw New ArgumentNullException("output")
End If
If (encoding Is Nothing) Then
Throw New ArgumentNullException("encoding")
End If
If Not output.CanWrite Then
Throw New ArgumentException(Environment.GetResourceString("Argument_StreamNotWritable"))
End If
- если вы не указали вывод, т.е. если поток имеет значение null. Это не должно быть проблемой, поскольку нулевой поток означает отсутствие ресурсов для утилизации:)
- если вы не указали кодировку. так как мы не используем конструкторную форму, в которой указано кодирование, здесь также не должно быть проблем (я не слишком много смотрел на конструктор кодировки, но некорректная кодовая страница может вызывать)
- если вы не передаете поток, доступный для записи. Это нужно быстро поймать во время разработки...
В любом случае, хорошая точка, следовательно, редактирование:)