c# création d'un fichier à l'aide de memorystream au lieu de textwriter

j'ai une application qui crée actuellement un fichier texte à importer dans une application de déclaration en détail. C'est en utilisant le code suivant pour créer le fichier et écrire des lignes:

    TextWriter tw = new StreamWriter(ExtractFileName);

    tw.WriteLine("reftACCOUNTtbatchtDEBITtCREDITtDesc");

j'ai maintenant besoin de créer plusieurs fichiers d'extraction et de planifier de les compresser en un seul .fichier zip en utilisant SharpZipLib (#ziplib) et je veux changer mon code pour faire la création de fichier texte "en mémoire" et en utilisant cela pour créer mon fichier zip. Je pense que je devrais être de la création/utilisation d'un MemoryStream mais je ne sais pas comment porter mon code existant.

Merci.

31
demandé sur tmcallaghan 2009-04-23 17:02:28

3 réponses

Tu pourrais faire:

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

tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
85
répondu Peter Lillevold 2009-04-23 13:05:56

Ne créez pas d'abstraction inutile. bien que la classe exportateur soit cool, elle ajoute de la valeur seulement lorsque vous avez plus d'une stratégie d'exportation. Sinon, c'est du fouillis qui distrait de l'objectif principal de votre code.

Si vous souhaitez ajouter l'exportateur pratique une bonne abstraction de la technique c'est bien, mais il y a infini possibilités d'abstraction lors de l'écriture d'une quantité significative de code. L'Abstraction crée la modularité et réduit le code lorsqu'il y a plusieurs implémentations d'un processus particulier ou un ensemble de données.

9
répondu Nathaniel 2012-10-26 14:00:14

je suggère aussi que ce soit le bon moment pour essayer de découpler certaines parties de votre application, afin que vous puissiez en changer d'autres à l'avenir. Donc, un TextWriter est une bonne abstraction pour un flux writable, mais envisagez d'abstraire aussi votre Classe export.

E. g. maintenant, vous voulez le faire comme ceci:

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

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

de sorte que vous pouvez facilement le remplacer par:

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

ou toute autre application:

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

En fournissant un protocole indépendant l'interface de maintenant, vous allez faire votre vie plus facile plus tard.

6
répondu Groo 2011-09-05 19:32:52