13

我正在尝试在内存中创建一个文本文件,向其中添加一些行,最后将文件保存在文本文件中。我可以处理 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() 在不同的地方添加更多的行,所以我想在程序结束时保存它(所以这应该包含在 using{} 之类的东西之间)

更新

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

谢谢。

4

5 回答 5

8

我认为您最好的选择是写到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());
于 2011-04-18T12:35:03.107 回答
2

或者,与@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());
}

Wherepath是表示有效文件系统入口路径的字符串,由您在应用程序的某处预定义。

于 2011-04-18T12:43:42.690 回答
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());
于 2011-04-18T12:36:33.410 回答
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)

于 2011-04-18T12:41:05.023 回答
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对象(在您的示例中为 a MemoryStream),您可以执行相同操作但替换该行:

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

经过

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

编辑:
关于将语句包装在里面using

考虑到这根本不是问题。在我的第一个示例中,您所要做的就是保留该StringBuilder对象,并继续向其添加行。一旦你有你想要的,只需将数据写入一个文本文件。

如果您打算多次写入文本文件,只需清除StringBuilder每次写入,以免得到重复数据。

于 2011-04-18T12:58:28.907 回答