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

FileHelpers WriteStream无数据写入问题求助

问题原因及解决办法

你的代码里有两个关键问题导致MemoryStream中没有数据:

  1. StreamWriter缓冲未刷新:StreamWriter默认会将数据暂存在内存缓冲中,不会立即写入底层的MemoryStream。调用WriteStream后,数据还留在StreamWriter的缓冲里,并未真正进入sw。
  2. MemoryStream位置未重置:就算数据成功写入MemoryStream,此时它的Position指针停在流的末尾,直接调用ToArray()会从末尾开始读取,自然获取不到内容。

修正后的代码:

var readerEngine = new FileHelperEngine<FixedWidthType>();
var writerEngine = new FileHelperEngine<CsvType>();

var file = File.ReadAllBytes("fixedWidthFile.txt");

using (var sr = new MemoryStream(file))
using (var reader = new StreamReader(sr))
using (var sw = new MemoryStream())
using (var writer = new StreamWriter(sw))
{
    // 读取固定宽度数据
    var fixedWidthRecords = readerEngine.ReadStream(reader);

    var csvRecords = fixedWidthRecords.Select(r => new CsvType
    {
        BranchCode = r.BranchCode,
        // ...
    }).ToList();

    Console.WriteLine(csvRecords.Count()); // 输出: 2

    // 写入CSV数据
    writerEngine.WriteStream(writer, csvRecords);
    
    // 关键步骤1:刷新StreamWriter缓冲,将数据写入MemoryStream
    writer.Flush();
    // 关键步骤2:重置MemoryStream的位置到起始处
    sw.Position = 0;

    Console.WriteLine(sw.ToArray().Length); // 现在能输出正确长度
    File.WriteAllBytes("newfile.csv", sw.ToArray());
}

你也可以在声明StreamWriter时设置AutoFlush = true,这样每次写入都会自动刷新缓冲,但批量写入后手动调用Flush()的效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:37:12