Для иллюстрации давайте отредактируем ваш код
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
- если вы не указали вывод, т.е. если поток равен нулю. Это не должно быть проблемой, поскольку нулевой поток означает отсутствие ресурсов для удаления:)
- если вы не указали кодировку. поскольку мы не используем форму конструктора, в которой указана кодировка, здесь также не должно возникнуть проблем (я не слишком много смотрел на конструктор кодирования, но может выдать недопустимую кодовую страницу)
- если вы не передаете записываемый поток. Это должно быть поймано довольно быстро во время разработки ...
В любом случае, хорошая мысль, отсюда и правка:)