我有一个应用程序正在创建一个文本文件以导入到会计应用程序中。它使用以下代码创建文件并为其写入行:
TextWriter tw = new StreamWriter(ExtractFileName);
tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
我现在需要创建多个提取文件,并计划使用SharpZipLib(#ziplib)将它们压缩为单个.zip文件,并希望更改我的代码以在内存中创建文本文件“并使用它创建我的zip文件。我想我应该创建/使用MemoryStream但是无法弄清楚如何移植我现有的代码。
感谢。
答案 0 :(得分:86)
你可以这样做:
MemoryStream memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);
tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
答案 1 :(得分:9)
不要创建不必要的抽象。虽然导出器类很酷,但只有在有多个导出策略时才会增加价值。否则就会分散你的代码的核心目的。
如果要将导出器添加到 practice 这是一个很好的抽象技术,但在编写任何大量代码时都有无限抽象机会。当有特定进程或数据集的多个实现时,抽象创建模块化并减少代码 。
答案 2 :(得分:6)
我还建议现在是尝试将应用程序的各个部分分离的好时机,以便将来可以更改部分内容。因此,TextWriter
是可写流的良好抽象,但也考虑抽象出口类。
E.g。现在你想这样做:
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);
现在通过提供独立于协议的界面,您将在以后更轻松地生活。