Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c# creating file using memorystream instead of textwriter

I have an application that is currently creating a text file to import into an accounting application. It is using the following code to create the file and write lines to it:

    TextWriter tw = new StreamWriter(ExtractFileName);

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

I now need to create multiple extract files and plan on compressing them into a single .zip file using SharpZipLib (#ziplib) and want to change my code to do the text file creation "in memory" and using that to create my zip file. I think I should be creating/using a MemoryStream but can't figure out how to port my existing code.

Thanks.

like image 249
tmcallaghan Avatar asked Apr 23 '09 13:04

tmcallaghan


3 Answers

You could do:

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

tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
like image 143
Peter Lillevold Avatar answered Oct 19 '22 06:10

Peter Lillevold


Don't create unnecessary abstraction. While the exporter class is cool it only adds value when you have more than one export strategy. Otherwise it is clutter that distracts from the core purpose of your code.

If you want to add the exporter to practice a good abstraction technique that's fine, but there are infinite abstraction opportunities when writing any significant amount of code. Abstraction creates modularity and reduces code only when there are multiple implementations of a particular process or data set.

like image 8
Nathaniel Avatar answered Oct 19 '22 05:10

Nathaniel


I would also suggest that this is a good time to try to decouple parts of your app, so that you can change parts of it in the future. So, a TextWriter is a good abstraction for a writable stream, but consider abstracting your export class also.

E.g. now you want to do it like this:

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

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

so that you can easily change it to:

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

or any other implementation:

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

By providing a protocol independent interface now, you will make your life easier later.

like image 6
Groo Avatar answered Oct 19 '22 04:10

Groo