在内存中写入文本文件并使用savefiledialog保存

本文关键字:savefiledialog 保存 文件 文本 内存 | 更新日期: 2023-09-27 17:50:23

我试图在内存中创建一个文本文件,向其添加一些行,并在最后将文件保存在文本文件中。我可以处理保存对话框部分,但我不知道如何从记忆中获得文本文件。任何帮助和提示将不胜感激。

目前我正在做的是:

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

请注意我将调用twin。writeline()在不同的地方添加更多的行所以我想把它保存在程序的末尾(所以它应该被包装在像使用{}这样的东西之间)

StringBuilder似乎是一个更可靠的选择!当我使用MemoryStream时,我的文本文件中会出现奇怪的剪切。

谢谢。

在内存中写入文本文件并使用savefiledialog保存

我认为你最好的选择是写信给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());

或者,和@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是一个字符串,表示有效的文件系统入口路径,由您在应用程序的某个地方预定义。

假设您的SaveFileDialog名称为"dialog"

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

就像这样。

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)

在文件末尾添加文本的另一种方法是:

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,以避免重复数据