c # создание файла с использованием потока памяти вместо текстового редактора - PullRequest
31 голосов
/ 23 апреля 2009

У меня есть приложение, которое в настоящее время создает текстовый файл для импорта в приложение учета. Он использует следующий код для создания файла и записи в него строк:

    TextWriter tw = new StreamWriter(ExtractFileName);

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

Теперь мне нужно создать несколько файлов извлечения и планировать сжатие их в один файл .zip, используя SharpZipLib (#ziplib), и хочу изменить свой код, чтобы создать текстовый файл «в памяти» и использовать его для создания почтовый файл Я думаю, что должен создавать / использовать MemoryStream, но не могу понять, как перенести мой существующий код.

Спасибо.

Ответы [ 3 ]

86 голосов
/ 23 апреля 2009

Вы можете сделать:

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

tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
9 голосов
/ 26 октября 2012

Не создавайте ненужную абстракцию. Несмотря на то, что класс-экспортер классный, он добавляет ценность только тогда, когда у вас более одной стратегии экспорта. В противном случае это беспорядок, который отвлекает от основной цели вашего кода.

Если вы хотите добавить экспортер в , попробуйте хорошую технику абстракции, это хорошо, но есть бесконечные возможности абстракции при написании любого значительного объема кода. Абстракция создает модульность и сокращает код только при наличии нескольких реализаций конкретного процесса или набора данных.

6 голосов
/ 23 апреля 2009

Я бы также предположил, что сейчас самое время попытаться отделить части вашего приложения, чтобы вы могли изменить его в будущем. Итак, TextWriter - это хорошая абстракция для потока, доступного для записи, но рассмотрите возможность абстрагирования вашего класса экспорта.

например. Теперь вы хотите сделать это так:

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

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

, чтобы вы могли легко изменить его на:

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

или любая другая реализация:

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

Предоставляя независимый от протокола интерфейс, вы упростите себе жизнь.

...