c#使用memorystream而不是textwriter创建文件

tmc*_*han 31 c# memorystream

我有一个应用程序,当前正在创建一个文本文件导入到一个会计应用程序.它使用以下代码创建文件并向其写入行:

    TextWriter tw = new StreamWriter(ExtractFileName);

    tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
Run Code Online (Sandbox Code Playgroud)

我现在需要创建多个提取文件,并计划使用SharpZipLib(#ziplib)将它们压缩为单个.zip文件,并希望更改我的代码以在内存中创建文本文件,并使用它创建我的zip文件.我想我应该创建/使用MemoryStream但是无法弄清楚如何移植我现有的代码.

谢谢.

Pet*_*old 86

你可以这样做:

MemoryStream  memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);

tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
Run Code Online (Sandbox Code Playgroud)

  • 通常建议对内存流使用`using`以确保处理. (5认同)
  • @ppumkin - 同意,但是:1)我的示例旨在展示如何将 MemoryStream 与 StreamWriter 一起使用,而不是关于资源处置的讲座。2)何时以及如何处理流很大程度上取决于OP代码的其余部分。始终确保处置,尽管并不总是可以使用“using”。 (3认同)

小智 9

不要创建不必要的抽象.虽然导出器类很酷,但只有在有多个导出策略时才会增加价值.否则,它会使您的代码的核心目的分散注意力.

如果你想添加导出器来实践一个很好的抽象技术,但是在编写任何大量代码时都有无限的抽象机会.只有在特定进程或数据集的多个实现时,抽象才会创建模块化并减少代码.


Gro*_*roo 6

我还建议现在是尝试将应用程序的各个部分分离的好时机,以便将来可以更改部分内容.因此,a TextWriter是可写流的良好抽象,但也考虑抽象出口类.

例如,你现在想要这样做:

MemoryStream  memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);

// tab-delimited export
IExporter exporter = new DelimiterExport(data, tw, "\t"); 
exporter.Export();
Run Code Online (Sandbox Code Playgroud)

这样您就可以轻松将其更改为:

// csv file (stands for "comma separated value", but you should actually
// use a culture-specific list separator instead)
var separator = Thread.CurrentThread.CurrentCulture.TextInfo.ListSeparator;
IExporter exporter = new DelimiterExport(data, tw, separator);
Run Code Online (Sandbox Code Playgroud)

或任何其他实施:

// excel export
IExporter exporter = new ExcelExport(data, tw);
Run Code Online (Sandbox Code Playgroud)

通过现在提供独立于协议的界面,您将在以后更轻松地生活.