32

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

    TextWriter tw = new StreamWriter(ExtractFileName);

    tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");

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

谢谢。

4

3 回答 3

91

你可以这样做:

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

tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
于 2009-04-23T13:05:56.277 回答
8

不要创建不必要的抽象。虽然导出器类很酷,但它仅在您拥有多个导出策略时才增加价值。否则,混乱会分散您代码的核心目的。

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

于 2012-10-26T14:00:14.387 回答
6

我还建议这是尝试解耦应用程序部分的好时机,以便您将来可以更改部分应用程序。因此,aTextWriter是可写流的一个很好的抽象,但也要考虑抽象您的导出类。

例如,现在你想这样做:

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

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

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

// 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);

或任何其他实现:

// excel export
IExporter exporter = new ExcelExport(data, tw);

通过现在提供独立于协议的接口,您以后的生活会更轻松。

于 2009-04-23T13:19:20.240 回答