C#中用两个using语句向同一文件写入内容报错问题咨询
问题解答
1. StreamWriter关闭时是否会关闭对应的FileStream?
是,默认情况下,StreamWriter在被释放(比如using块结束时)会自动关闭它所包装的底层流(这里的FileStream)。这是因为StreamWriter的默认构造逻辑会接管底层流的生命周期,当自身被销毁时会一并关闭底层流。
2. 如何避免StreamWriter关闭底层FileStream?
使用StreamWriter的重载构造函数,指定leaveOpen: true参数,这样StreamWriter释放时就不会关闭底层的FileStream。同时需要手动调用Flush()方法,确保StreamWriter的缓存内容全部写入到FileStream中,避免后续写入的压缩数据位置错误。
修改后的代码示例:
// Code where we get values of the following variables: // string filename // Byte[] buffer using (FileStream file = new(filename, FileMode.Create, FileAccess.Write)) { // 使用leaveOpen: true的构造函数 using (StreamWriter writer = new(file, leaveOpen: true)) { writer.WriteLine("sometext"); writer.WriteLine("somemoretext"); writer.Flush(); // 确保缓存写入底层流 } using (GZipStream zipStream = new(file, CompressionMode.Compress)) { zipStream.Write(buffer, 0, buffer.Length); } }
原代码报错原因
原代码中第一个using块结束时,StreamWriter释放并关闭了FileStream,后续创建GZipStream时传入的是已关闭的流,关闭的流不支持写入操作,因此抛出System.ArgumentException异常。
内容的提问来源于stack exchange,提问作者5xum
相关产品推荐
相关产品推荐

