web-dev-qa-db-fra.com

c # création de fichier en utilisant memorystream au lieu de textwriter

J'ai une application qui crée actuellement un fichier texte à importer dans une application de comptabilité. Il utilise le code suivant pour créer le fichier et y écrire des lignes:

    TextWriter tw = new StreamWriter(ExtractFileName);

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

Je dois maintenant créer plusieurs fichiers d'extraction et planifier de les compresser en un seul fichier .Zip à l'aide de SharpZipLib (#ziplib) et je veux changer mon code pour créer le fichier texte "en mémoire" et l'utiliser pour créer mon fichier Zip. Je pense que je devrais créer/utiliser un MemoryStream mais je ne sais pas comment porter mon code existant.

Merci.

31
tmcallaghan

Vous pourriez faire:

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

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

Ne créez pas d'abstraction inutile. Bien que la classe d'exportateur soit cool, elle n'ajoute de la valeur que lorsque vous avez plusieurs stratégies d'exportation. Sinon, c'est l'encombrement qui détourne l'attention de l'objectif principal de votre code.

Si vous voulez ajouter l'exportateur à pratiquer une bonne technique d'abstraction, c'est bien, mais il y a infini opportunités d'abstraction lors de l'écriture de tout quantité importante de code. L'abstraction crée la modularité et réduit le code niquement lorsqu'il existe plusieurs implémentations d'un processus ou d'un ensemble de données particulier.

9
Nathaniel

Je dirais également que c'est le bon moment pour essayer de découpler des parties de votre application, afin que vous puissiez en changer des parties à l'avenir. Ainsi, un TextWriter est une bonne abstraction pour un flux inscriptible, mais pensez également à abstraire votre classe d'exportation.

Par exemple. 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();

afin que vous puissiez facilement le changer en:

// 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 implémentation:

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

En fournissant maintenant une interface indépendante du protocole, vous vous faciliterez la vie plus tard.

6
Groo