1

我有一个用 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 打开文件并且效果很好。有人可以帮助我让它正常工作吗?

4

2 回答 2

3

您的问题是您正在尝试将文件转换为字符串,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。

于 2013-05-08T23:02:31.077 回答
2

您正在使加载 RTF 的天气非常恶劣。正如@evanmcdonnal 解释的那样,您将文件读入字符串的代码永远不会起作用。您成功的基于文件对话框的代码真的这样做了吗?请记住,文件对话框只是在字符串中生成文件名的 UI。如果您的带有文件对话框的代码有效,那么当文件对话框被硬编码字符串替换时,它将起作用。

我怀疑您的问题的某些部分是您使用的是相对路径。也许工作目录不是您期望的那样。您应该指定文件的完整路径。

无论如何,要加载 RTF,只需调用控件的 LoadFile 方法。但我强烈建议传递文件的完整路径。

richTextBoxPrintCtrl1.LoadFile(fullPathToRtfFile);
于 2013-05-08T22:57:32.993 回答