Подтвердить что ты не робот

Запись текстового файла в память и сохранение его с помощью savefiledialog

Я пытаюсь сделать текстовый файл в памяти, добавить некоторые строки к нему и в конце сохранить файл в текстовом файле. Я могу обрабатывать часть 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.

Спасибо.

4b9b3361

Ответ 1

Я думаю, что ваш лучший вариант здесь - написать 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

Предположим, что ваше имя 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());

Ответ 3

Или, что-то похожее на ответ @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 - строка, представляющая допустимый путь входа в файловую систему, предопределенный вами где-то в приложении.

Ответ 4

Что-то вроде этого.

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).

Ответ 5

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

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)) {

Edit:
Об обертывании операторов внутри using:

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

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