1

C# で作成したリッチ テキスト エディターがあります。私が今追加しようとしている機能の 1 つはテンプレートです。ユーザーが OpenFileDialog を使用してテンプレートに移動し、ファイルを開く必要はありません。テンプレートを開くためにユーザーが 1 つのボタンをクリックするだけでよいように、ファイルパスを自分で指定したいと思います。

現在、次のコードを使用してこれを達成しようとしています。

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 に答える