使用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
相关产品推荐
相关产品推荐

