You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:22:04