Запись текстового файла в память и сохранение его с помощью savefiledialog - PullRequest
13 голосов
/ 18 апреля 2011

Я пытаюсь создать текстовый файл в памяти, добавить в него несколько строк и в конце сохранить файл в текстовом файле.Я могу обработать часть saveialog, но я не знаю, как получить текстовый файл из памяти.Любая помощь и советы будут оценены.

Что я делаю до сих пор:

//Initialize in memory text writer
MemoryStream ms = new MemoryStream(); 
TextWriter tw = new StreamWriter(ms);

tw.WriteLine("HELLO WORLD!");
tw.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!);

пожалуйста, обратите внимание Я позвоню tw.WriteLine () добавить больше строкв разных местах, поэтому я хочу сохранить это в конце программы (так что это плечо будет заключено в нечто вроде использования {})

UPDATE

StringBuilder, кажетсяболее надежный вариант для этого!В моем текстовом файле появляются странные вырезы, когда я делаю это с помощью MemoryStream.

Спасибо.

Ответы [ 5 ]

8 голосов
/ 18 апреля 2011

Я думаю, что ваш лучший вариант здесь будет написать StringBuilder, а когда закончите, File.WriteAllText. Если содержимое большое , вы можете сначала записать его непосредственно в файл (через File.CreateText(path)), но для файлов малого и среднего размера это подойдет.

var sb = new StringBuilder();

sb.AppendLine("HELLO WORLD!");
sb.AppendLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!");

File.WriteAllText(path, sb.ToString());
2 голосов
/ 18 апреля 2011

Или что-то похожее на ответ @ Marc, но достаточно разное, и я думаю, что в качестве правильного решения стоит добавить:

using (var writer = new StringWriter())
{
    writer.WriteLine("HELLO WORLD!");
    writer.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!");
    File.WriteAllLines(path, writer.GetStringBuilder().ToString());
}

Где path - это строка, представляющая допустимый путь входа в файловую систему, предварительно определенный вами где-то в приложении.

2 голосов
/ 18 апреля 2011

Предположим, ваше SaveFileDialog имя "Диалог"

File.WriteAllBytes(dialog.FileName, Encoding.UTF8.GetBytes("Your string"));

или

var text = "Your string";
text += "some other text";
File.WriteAllText(dialog.FileName, text);

также в своем собственном решении вы можете сделать это:

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

tw.WriteLine("HELLO WORLD!");
tw.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!);

// just add this
File.WriteAllBytes(dialog.FileName, ms.GetBuffer());
0 голосов
/ 18 апреля 2011

Другим способом добавления текста в конец файла может быть:

if (saveFileDialog.ShowDialog() == DialogResult.OK) {
    using (var writer = new StreamWriter(saveFileDialog.Filename, true)) {
        writer.WriteLine(text);
    }
}

при условии, что text - это строка, которую необходимо сохранить в файл.Если вы хотите добавить новые строки к этой строке простым способом, вы можете сделать:

var sb = new StringBuilder();
sb.AppendLine("Line 1");
sb.AppendLine("Line 2");

, и полученная строка будет sb.ToString()

Если у вас уже есть Stream объект (в вашем примере, MemoryStream), вы можете сделать то же самое, но заменить строку:

using (var writer = new StreamWriter(saveFileDialog.Filename, true)) {

на

using (var writer = new StreamWriter(memoryStream)) {

Редактировать:
Об упаковке утверждений внутри using:

Примите во внимание, что это вообще не проблема.В моем первом примере все, что вам нужно будет сделать, это сохранить этот объект StringBuilder и добавлять к нему строки.Если у вас есть то, что вы хотите, просто запишите данные в текстовый файл.

Если вы планируете записывать более одного раза в текстовый файл, просто очищайте StringBuilder каждый раз, когда вы пишете, чтобы неполучить дублированные данные.

0 голосов
/ 18 апреля 2011

Примерно так.

Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".text"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension

// Show save file dialog box
Nullable<bool> result = dlg.ShowDialog();

// Process save file dialog box results
if (result == true)
{
    // Save document
    using (FileStream file = File.CreateText(dlg.FileName)
    {
        ms.WriteTo(file)
    }
}

Я не беспокоюсь о том, что файл уже существует, но это должно приблизить вас.

Возможно, вам тоже понадобится ms.Seek(SeekOrgin.Begin, 0).

...