我正在尝试在内存中创建一个文本文件,向其中添加一些行,最后将文件保存在文本文件中。我可以处理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执行此操作时,我的文本文件中出现了奇怪的剪切。
感谢。
答案 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
,以免获得重复数据。