【问题标题】:How can I open a specific text file without using OpenFileDialog?如何在不使用 OpenFileDialog 的情况下打开特定的文本文件?
【发布时间】:2023-03-24 05:03:02
【问题描述】:

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

【问题讨论】:

    标签: c# file-io richtextbox filestream


    【解决方案1】:

    您的问题是您尝试使用 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。

    【讨论】:

    • 那么代码会是什么样子?我试过这样做,但遇到了问题。请查看我的更新代码的编辑问题。
    • @Toby 使用您的代码进行了编辑。还有 NewFile() 里面的第一个 if 调用可能会导致问题,但我不知道你想在那里完成什么,所以我不能说。
    • NewFile() 所做的只是在加载模板之前清除文本字段。如果 rtb 已被修改,它还会提示用户保存。
    • @Toby 在这种情况下,如果您删除所有 FileStream 代码并仅使用 File.ReadAllText 调用,它应该可以工作。
    【解决方案2】:

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

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

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

    richTextBoxPrintCtrl1.LoadFile(fullPathToRtfFile);
    

    【讨论】:

    • 我不知道你能做到这一点。那是理想的。非常感谢。 :)
    • @evan 谢谢。看起来有点恶心。
    • 正如我之前所说,我是一个完全的新手,所以如果我做的任何事情都存在新手错误,我很抱歉。并感谢你们的帮助。
    • 别抱歉。从前,我们都在你所在的地方!很遗憾@evan 删除了他的答案,因为它包含了很好的建议。
    • @DavidHeffernan 我想我会取消删除,它只是变得非常分散,然后你提供了 1 行灵丹妙药,所以...
    猜你喜欢
    • 2017-10-19
    • 2021-12-27
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2014-11-06
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多