我有一个用C#创建的富文本编辑器。我现在尝试添加的功能之一是模板。我不希望用户必须使用OpenFileDialog导航到模板并打开文件。我想自己指定文件路径,以便用户只需单击一个按钮即可打开模板。
目前,我正在尝试使用以下代码实现此目的:
private void formalLetterToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
FileStream fileStream = new FileStream(@".\templates\tmp1.rtf", FileMode.Open);
String str;
str = fileStream.ToString();
string fileContents = File.ReadAllText(filepath);
fileContents = fileStream.ToString();
try
{
if (richTextBoxPrintCtrl1.Modified == true);
{
NewFile();
}
richTextBoxPrintCtrl1.Rtf = fileContents;
}
catch (Exception exception)
{
MessageBox.Show("There was an error opening the template. " + exception, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception exception)
{
MessageBox.Show("There was an error opening the template. " + exception, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
但是,每当我尝试打开模板时,都会收到如下异常:
System.ArgumentsException:文件格式无效。
但是,我试图使用我的OpenFileDialog打开文件,并且工作正常。有人可以协助我让这个工作正常吗?
答案 0 :(得分:2)
你正在加载RTF的天气非常恶劣。正如@evanmcdonnal解释的那样,将文件读入字符串的代码永远不会起作用。基于文件对话框的代码是否真的像那样做了?请记住,文件对话框只是在字符串中生成文件名的UI。如果带有文件对话框的代码有效,那么当用硬编码字符串替换文件对话框时,它将起作用。
我怀疑你问题的某些部分是你正在使用相对路径。也许工作目录不是您所期望的。您应该指定文件的完整路径。
在任何情况下,要加载RTF,只需调用控件的LoadFile方法即可。但我强烈建议将完整路径传递给文件。
richTextBoxPrintCtrl1.LoadFile(fullPathToRtfFile);
答案 1 :(得分:2)
您的问题是您尝试使用str = fileStream.ToString();
将文件转换为字符串,但是,这会将文件流转换为不同的字符串。
相反,只需执行string fileContents = File.ReadAllText(filepath);
即可将所有文件内容转换为字符串。如果要对文件进行某种类型的处理,则只需要使用FileStream / StreamReader。
此外,您对FileStream的使用有点偏差。我认为你真正想要的是一个类似这样的StreamReader(来自msdn的例子);
using (StreamReader sr = new StreamReader("TestFile.txt"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
FileStream不能用于读取文件。它必须传递给StreamReader才能实际读取文件,在这种情况下,没有必要这样做,因为构造函数有一个带有文件路径的重载。只有在您不知道读者将阅读哪种流时,它才有用。
你在哪里;
FileStream fileStream = new FileStream(@".\templates\tmp1.rtf", FileMode.Open);
String str;
str = fileStream.ToString();
string fileContents = File.ReadAllText(filepath);
fileContents = fileStream.ToString();
你实际上只是想要线条; string fileContents = File.ReadAllText(filepath);
,别的。当您只是将所有文本读入字符串时,不需要FileStream。