2009-04-23 13 views
30

Ho un'applicazione che sta attualmente creando un file di testo da importare in un'applicazione di contabilità. Sta usando il codice seguente per creare il file e scrivere le linee ad esso:C# crea file usando memorystream anziché textwriter

TextWriter tw = new StreamWriter(ExtractFileName); 

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

ora ho bisogno di creare più file estratto e il piano su comprimerli in un unico file .zip usando SharpZipLib (#ziplib) e voglio cambiare il mio codice per fare la creazione del file di testo "in memoria" e usarlo per creare il mio file zip. Penso che dovrei creare/usare un MemoryStream ma non riesco a capire come eseguire il port del mio codice esistente.

Grazie.

risposta

83

si potrebbe fare:

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

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

Perfetto, grazie per la rapida risposta. Il mio file .zip è ora creato. – tmcallaghan

+0

Questo è fantastico, felice di essere d'aiuto :) –

+5

Di solito si consiglia di utilizzare l'uso di "memoria" per garantire lo smaltimento. – ppumkin

6

Vorrei anche suggerire che questo è un buon momento per cercare di separare le parti della vostra app, in modo che si può cambiare parti di esso in futuro. Quindi, una TextWriter è una buona astrazione per uno stream scrivibile, ma considera anche l'astrazione della tua classe di esportazione.

E.g. ora si vuole fare in questo modo:

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

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

in modo che si può facilmente cambiare 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 qualsiasi altra applicazione:

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

Fornendo un'interfaccia indipendente dal protocollo ora, ti semplificheresti la vita più tardi.

9

Non creare un'astrazione non necessaria. Mentre la classe dell'esportatore è interessante, aggiunge valore solo quando si dispone di più di una strategia di esportazione. Altrimenti è un disordine che distrae dallo scopo principale del tuo codice.

Se si desidera aggiungere all'esportatore di pratica una buona tecnica di astrazione che va bene, ma ci sono infinite opportunità di astrazione durante la scrittura di una quantità significativa di codice. L'astrazione crea modularità e riduce il codice solo quando esistono più implementazioni di un particolare processo o set di dati.

+0

IOW, YAGNI. * ahem * –

+0

@MarcL. CTHULHU FHTAGN! –