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