Согласно
документации, метод
Close
у
StreamWriter
самостоятельно закрывает нижележащий поток (в вашем случае это
FileStream
). И при закрытии нижележащего потока
StreamWriter
пытается записать в него всё, что, возможно, успело накопиться в буфере,но еще не было записано (строка
System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
в вашем стектрейсе).
Но так как файловый поток уже закрыт, вызов метода
Flush
приводит к ошибке.
Совет на будущее - закрывайте потоки в порядке обратном тому, в котором вы их открывали. Т.е. если вы их открывали в порядке
A -> B(A) -> C(B)
, то закрывать их надо в порядке
C, B, A
.
По крайней мере в Java, закрытие уже закрытого потока является по сути no-op (если поток уже закрыт, то делается
return
из метода
Close
). И подозреваю, что в C# сделано так же. А значит и ошибок таких не будет.