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

时间:2011-04-18 12:31:45

标签: c# memorystream savefiledialog textwriter

我正在尝试在内存中创建一个文本文件,向其中添加一些行,最后将文件保存在文本文件中。我可以处理savedialog部分,但我不知道如何从内存中获取文本文件。任何帮助和提示都会受到关注。

到目前为止我所做的是:

//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()在不同的地方添加更多行,所以我想在程序结束时保存它(所以这个主题应该包含在使用{}之类的内容中

更新

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

感谢。

5 个答案:

答案 0 :(得分:8)

我认为您最好的选择是写入StringBuilder,完成后File.WriteAllText。如果内容是 large ,您可能会考虑首先直接写入文件(通过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());

答案 1 :(得分: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());

答案 2 :(得分:2)

答案 3 :(得分:0)

像这样。

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)

答案 4 :(得分: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,以免获得重复数据。