0

私がやろうとしているのは、OnSelectedIndexChangeメソッドを使用してファイルをrichTextBoxに自動的に読み込むことです。エラーはありませんが、完全に機能しません。これが私が使っているコードです

    public void comboBox1_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        string selectedPath = comboBox1.SelectedItem.ToString();
        if (File.Exists(@"C:\\Mavro\\MavBridge\\" + selectedPath + "\\ " + "Comment" + ".txt"))
        {
            try
            {
                Thread.Sleep(0500);
                System.IO.StreamReader textFile = new System.IO.StreamReader(@"C:\\Mavro\\MavBridge\\" + selectedPath + "\\ " + "Comment" + ".txt");
                richTextBox1.Text = textFile.ReadToEnd();
                textFile.Close();
            }
            catch
            {                
                MessageBox.Show("Error: File cannot be opened!", "Error");
            }
        }
        else
        {
            MessageBox.Show("No comment was found in this folder", "Alert");
        }
    }
4

4 に答える 4

3

楽しみのために、何か試してみましょう。まず、次の行を置き換えます。

if (File.Exists(@"C:\\Mavro\\MavBridge\\" + selectedPath + "\\ " + "Comment" + ".txt"))

これとともに:

if(File.Exists(string.Format("C:\\Mavro\\MavBridge\\{0}\\Comment.txt", selectedPath)))

余分なスペース ( ) があったように見える"\\ " + "Comment"ので、このコード ブロックにヒットしないのはそのためだと思います。また、閉じる/破棄する必要があるオブジェクトがあるときはいつでも、多くの場合、IDisposable を実装します。つまり、オブジェクトをusingブロック内にカプセル化する必要があります。

Thread.Sleep(0500);
try
{
    using(System.IO.StreamReader textFile = new System.IO.StreamReader(string.Format("C:\\Mavro\\MavBridge\\{0}\\Comment.txt", selectedPath)))
    {
        richTextBox1.Text = textFile.ReadToEnd();
    }

}
catch
{                
    MessageBox.Show("Error: File cannot be opened!", "Error");
}

ただし、StreamReader を完全にバイパスし、代わりに System.IO.File.ReadAllText を使用することで、これをさらに簡素化できます。

richTextBox1.Text = System.IO.File.ReadAllText(string.Format("C:\\Mavro\\MavBridge\\{0}\\Comment.txt", selectedPath));
于 2012-05-16T18:03:14.517 に答える
2

さて、1 つの問題は、次のような事実から生じます。

@"C:\\Mavro\\MavBridge\\" + selectedPath + "\\ " + "Comment" + ".txt"

逐語的な文字列 (先頭の@ ) を使用しているため、二重スラッシュを入れる必要はありません。

残りについては、ファイルが存在することを確認してください。

後で編集:また、急いでコピー/貼り付けしたかどうかはわかりませんが、実際にcatchブロックを のに入れましたtryか?

于 2012-05-15T14:56:41.900 に答える
1

1)表示されるエラーは何ですか?

2)ファイルが存在することを確認しますか?

3)コードによって作成されたパスが、期待しているパスであると確信していますか?

4)なぜあなたは糸を眠っているのですか?

5)File.ReadAllTextを使用しないのはなぜですか?

6)File.Existsは、ファイルが存在する場合でも、ファイルにアクセスできないアクセス許可でコードが実行されている場合、falseを返します。コードを実行しているユーザーに権限がありますか?

呼び出し元に必要な権限があり、パスに既存のファイルの名前が含まれている場合はtrue。それ以外の場合はfalse。このメソッドは、パスがnull、無効なパス、または長さがゼロの文字列の場合にもfalseを返します。呼び出し元に指定されたファイルを読み取るための十分な権限がない場合、例外はスローされず、パスの存在に関係なく、メソッドはfalseを返します。

指定されたファイルが存在するかどうかを判断しようとしているときにエラーが発生した場合、Existsメソッドはfalseを返します。これは、無効な文字または文字が多すぎるファイル名を渡す、ディスクの障害または欠落などの例外が発生する状況、または呼び出し元にファイルを読み取る権限がない場合に発生する可能性があります。

于 2012-05-15T14:57:22.623 に答える
0

各文字列の前にある@を削除します。現在のディレクトリでは、C:\ Mavro\MavBridgeの代わりに実際の二重スラッシュが使用されています。最初に\を使用するか、@を使用して単一のスラッシュを使用しますが、両方を使用しないでください。

また、そのようにピースを連結するのではなく、Path.Combineを使用することを強くお勧めします。

于 2012-05-15T14:59:31.460 に答える