如何在不使用OpenFileDialog的情况下打开特定的文本文件?

时间:2013-05-08 22:52:09

标签: c# file-io richtextbox filestream

我有一个用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打开文件,并且工作正常。有人可以协助我让这个工作正常吗?

2 个答案:

答案 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。