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

使用C#上传CSV至FTP服务器时遭遇“无法访问已关闭流”错误

CSV流上传FTP服务器时出现"can not access the closed stream"错误的解决方法

问题场景

开发CSV文件上传至FTP服务器的应用时,遇到错误:

can not access the closed stream

相关代码示例:

public Stream WriteCSV<T>(List<T> content) where T : class
{
    var stream = new MemoryStream();
    using (StreamWriter writer = new StreamWriter(stream))
    {
        using (CsvWriter csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        {
            csv.WriteRecords(content);
            writer.Flush();
        }
    }
    return stream;
}

// calling method
var _writeService = new WriteService();
using var stream = _writerService.WriteCSV(partLocatorFiltered.ToList());
var fileUploadPath = $"/input/partslocator042/KE5206205_TEST_CSV.csv";
await _iFtpClientService.SendFileAsync(_options?.FTP, stream, fileUploadPath);

错误原因

StreamWriter的默认行为是:当它被using块释放时,会自动关闭它所包裹的底层MemoryStream。你的代码中,using (StreamWriter writer = new StreamWriter(stream))块结束后,stream已经被关闭,后续调用SendFileAsync时尝试访问已关闭的流,就会触发该错误。

解决方法

1. 让StreamWriter释放时不关闭底层流

创建StreamWriter时,指定leaveOpen: true参数,这样using块结束后只会释放StreamWriter本身,不会关闭底层的MemoryStream:

public Stream WriteCSV<T>(List<T> content) where T : class
{
    var stream = new MemoryStream();
    // 关键:设置leaveOpen: true,保留底层流不关闭
    using (StreamWriter writer = new StreamWriter(stream, leaveOpen: true))
    {
        using (CsvWriter csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        {
            csv.WriteRecords(content);
            writer.Flush();
        }
    }
    // 重置流的位置到起始处,确保FTP能读取到完整内容
    stream.Position = 0;
    return stream;
}

2. 额外注意点

写入完成后必须将stream.Position设置为0,因为写入操作会把流的指针移到末尾,如果不重置,FTP上传时会从流的末尾开始读取,最终上传空白文件。

内容的提问来源于stack exchange,提问作者Kamran Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:05:52