打开(静默)保存的文件 c# 时出错
Error when opening a (silently) saved file c#
我一直在用 c# 制作一个文本编辑器,最近添加了静默保存文件的功能(没有 SaveFileDialog)。该文件似乎可以正确保存,但是,当我尝试打开该文件时,出现错误 System.ArgumentException - File format is not valid
。如果文件没有被静默保存,它可以正常打开。
代码:
保存方法:
public void save(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn, string fileNameIn)
{
string fileName = "";
if (getFileFromMap(fileNameIn) != "")
{
// The file already exists in the Map so save it
fileName = getFileFromMap(fileNameIn);
StreamWriter writer = new StreamWriter(fileName);
writer.Write(rtbIn.Text);
writer.Close();
}
else
{
// The file does not exist in the Map so
// Send it to SaveAs with the rtb and the initial fileName passed in
saveAs(rtbIn, fileNameIn);
}
}
另存为:
public string saveAs(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn, string fileName)
{
saveDialog.FileName = fileName;
saveDialog.Title = "Save As";
if (saveDialog.ShowDialog() == DialogResult.OK)
{
if (saveDialog.FileName.Length > 0)
{
if (saveDialog.FileName.EndsWith(".rtf"))
{
rtbIn.SaveFile(saveDialog.FileName, RichTextBoxStreamType.RichText);
}
else
{
rtbIn.SaveFile(saveDialog.FileName, RichTextBoxStreamType.PlainText);
}
addFileToMap(fileName, saveDialog.FileName);
return Path.GetFileName(saveDialog.FileName);
}
else { return ""; }
}
else { return ""; }
}
并打开:
public string open(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn)
{
if (openDialog.ShowDialog() == DialogResult.OK)
{
if (openDialog.FileName.Length > 0)
{
string fileName = Path.GetFileName(openDialog.FileName);
if (fileName.EndsWith(".rtf"))
{
rtbIn.LoadFile(openDialog.FileName, RichTextBoxStreamType.RichText);
}
else
{
rtbIn.LoadFile(openDialog.FileName, RichTextBoxStreamType.PlainText);
}
addFileToMap(openDialog.FileName, openDialog.FileName);
return fileName;
}
else { return ""; }
}
else { return ""; }
}
其他信息:
- 文件名存储在字典中,因为编辑器有标签。
- RichTextBoxPrintCtrl是一个支持打印的自定义RichTextBox,它不会改变任何与打开相关的内容
- 上述方法位于单独的 class 中,这就是为什么它们需要传入 richtextbox 的原因。
如果您需要任何其他代码,请告诉我。
任何意见,将不胜感激!提前致谢:)
编辑:
已修复,无法使用 StreamWriter。
好吧,问题似乎是您没有以相同的方式保存文件。
当您执行 saveAs
时,您正在调用 rtb.SaveFile
。在您的无声 save
中,您直接尝试将 rtb.Text
保存到文件中,但这可能不是 rtb.OpenFile
期望的正确格式。
我不是 RichTextBox
方面的专家,但发现方法有效和另一个类似方法的区别通常没有帮助。
再扩展一点,Text
returns 只有纯文本(没有内容格式信息)。您的方法 save
将任何文件保存为纯文本,即使它是 .rtf。另一方面,您的 Open
方法会尝试将 .rtf
文件作为格式化文本打开,这可能会导致您遇到问题。
我一直在用 c# 制作一个文本编辑器,最近添加了静默保存文件的功能(没有 SaveFileDialog)。该文件似乎可以正确保存,但是,当我尝试打开该文件时,出现错误 System.ArgumentException - File format is not valid
。如果文件没有被静默保存,它可以正常打开。
代码:
保存方法:
public void save(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn, string fileNameIn)
{
string fileName = "";
if (getFileFromMap(fileNameIn) != "")
{
// The file already exists in the Map so save it
fileName = getFileFromMap(fileNameIn);
StreamWriter writer = new StreamWriter(fileName);
writer.Write(rtbIn.Text);
writer.Close();
}
else
{
// The file does not exist in the Map so
// Send it to SaveAs with the rtb and the initial fileName passed in
saveAs(rtbIn, fileNameIn);
}
}
另存为:
public string saveAs(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn, string fileName)
{
saveDialog.FileName = fileName;
saveDialog.Title = "Save As";
if (saveDialog.ShowDialog() == DialogResult.OK)
{
if (saveDialog.FileName.Length > 0)
{
if (saveDialog.FileName.EndsWith(".rtf"))
{
rtbIn.SaveFile(saveDialog.FileName, RichTextBoxStreamType.RichText);
}
else
{
rtbIn.SaveFile(saveDialog.FileName, RichTextBoxStreamType.PlainText);
}
addFileToMap(fileName, saveDialog.FileName);
return Path.GetFileName(saveDialog.FileName);
}
else { return ""; }
}
else { return ""; }
}
并打开:
public string open(RichTextBoxPrintCtrl.RichTextBoxPrintCtrl rtbIn)
{
if (openDialog.ShowDialog() == DialogResult.OK)
{
if (openDialog.FileName.Length > 0)
{
string fileName = Path.GetFileName(openDialog.FileName);
if (fileName.EndsWith(".rtf"))
{
rtbIn.LoadFile(openDialog.FileName, RichTextBoxStreamType.RichText);
}
else
{
rtbIn.LoadFile(openDialog.FileName, RichTextBoxStreamType.PlainText);
}
addFileToMap(openDialog.FileName, openDialog.FileName);
return fileName;
}
else { return ""; }
}
else { return ""; }
}
其他信息:
- 文件名存储在字典中,因为编辑器有标签。
- RichTextBoxPrintCtrl是一个支持打印的自定义RichTextBox,它不会改变任何与打开相关的内容
- 上述方法位于单独的 class 中,这就是为什么它们需要传入 richtextbox 的原因。
如果您需要任何其他代码,请告诉我。 任何意见,将不胜感激!提前致谢:)
编辑: 已修复,无法使用 StreamWriter。
好吧,问题似乎是您没有以相同的方式保存文件。
当您执行 saveAs
时,您正在调用 rtb.SaveFile
。在您的无声 save
中,您直接尝试将 rtb.Text
保存到文件中,但这可能不是 rtb.OpenFile
期望的正确格式。
我不是 RichTextBox
方面的专家,但发现方法有效和另一个类似方法的区别通常没有帮助。
再扩展一点,Text
returns 只有纯文本(没有内容格式信息)。您的方法 save
将任何文件保存为纯文本,即使它是 .rtf。另一方面,您的 Open
方法会尝试将 .rtf
文件作为格式化文本打开,这可能会导致您遇到问题。