2009-04-23 24 views
30

Tengo una aplicación que actualmente está creando un archivo de texto para importar a una aplicación de contabilidad. Se está utilizando el siguiente código para crear el archivo y escribir líneas a la misma:C# creando archivos usando memorystream en lugar de textwriter

TextWriter tw = new StreamWriter(ExtractFileName); 

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

ahora tengo que crear varios archivos de extracción y el plan de comprimirlos en un único archivo .zip utilizando SharpZipLib (#ziplib) y quiero para cambiar mi código para hacer la creación del archivo de texto "en la memoria" y usarlo para crear mi archivo zip. Creo que debería crear/usar un MemoryStream pero no puedo descifrar cómo portar mi código existente.

Gracias.

Respuesta

83

que podría hacer:

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

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

Perfecto, gracias por la respuesta rápida. Mi archivo .zip ahora está creado. – tmcallaghan

+0

Eso es genial, me alegro de ser de ayuda :) –

+5

Por lo general, se recomienda utilizar 'using' con la secuencia de memoria para garantizar la eliminación. – ppumkin

6

Me gustaría también sugieren que este es un buen momento para tratar de desacoplar las partes de su aplicación, por lo que puede cambiar partes de ella en el futuro. Por lo tanto, TextWriter es una buena abstracción para una secuencia de escritura, pero considere también la posibilidad de abstraer su clase de exportación.

E.g. ahora quiere hacerlo de esta manera:

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

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

de modo que usted puede cambiar fácilmente a:

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

o cualquier otra aplicación:

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

Al proporcionar una interfaz independiente del protocolo ahora, harás tu vida más fácil más tarde.

9

No cree una abstracción innecesaria. Si bien la clase de exportador es genial, solo agrega valor cuando tiene más de una estrategia de exportación. De lo contrario, es un desorden que distrae del propósito principal de tu código.

Si desea agregar el exportador a la práctica una buena técnica de abstracción que está bien, pero hay infinitas oportunidades de abstracción al escribir cualquier cantidad significativa de código. La abstracción crea modularidad y reduce el código solo cuando hay múltiples implementaciones de un determinado proceso o conjunto de datos.

+0

IOW, YAGNI. * ejem * –

+0

@MarcL. CTHULHU FHTAGN! –