FileHelpers WriteStream无数据写入问题求助
问题原因及解决办法
你的代码里有两个关键问题导致MemoryStream中没有数据:
- StreamWriter缓冲未刷新:
StreamWriter默认会将数据暂存在内存缓冲中,不会立即写入底层的MemoryStream。调用WriteStream后,数据还留在StreamWriter的缓冲里,并未真正进入sw。 - 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
相关产品推荐
相关产品推荐

