我试图在内存中创建一个文本文件,向其添加一些行,并在最后将文件保存在文本文件中。我可以处理保存对话框部分,但我不知道如何从记忆中获得文本文件。任何帮助和提示将不胜感激。
目前我正在做的是:
//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时,我的文本文件中会出现奇怪的剪切。
谢谢。
我认为你最好的选择是写信给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
,以避免重复数据