11

これは、実際にファイルを読み取る前にファイルを読み取れるかどうかを確認しようとしている方法です

FileStream stream = new FileStream();
try
{
   // try to open the file to check if we can access it for read
   stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read);
}
catch (IOException ex)
{
   return false;
}
finally
{
   stream.Dispose();
}

これは正しい方法ですか?

も にFile.Open似ていますがFile.ReadAllText、つまり、パフォーマンスのコストは同じですか?

4

3 に答える 3

8

ファイルを読み取れるかどうかは、多くの要因によって異なります。アクセス権があるかどうか、ハード ディスクが壊れているかどうかなどです。私はおそらくあなたと同じ道をたどったでしょう。

ただし、この方法で得られる情報は単なるスナップショットであることに注意してください。このメソッドを呼び出した直後に誰かがファイルのアクセス許可を変更した場合、コード内で後でファイルにアクセスしても失敗します。このメソッドの結果に依存するべきではありません。

単なる提案です。次のコードは同じことを行いますが、もう少し簡潔です。

try
{
    File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read).Dispose();
    return true;
}
catch (IOException)
{
    return false;
}

実際にはストリームを使用していないため、ストリームへの参照を保持する必要はありません。代わりに、 の結果に対して dispose を呼び出すことで、ストリームをただちに破棄できますFile.Open()

編集:

ステートメントを使用する代わりに を末尾に置いた理由については、https://gist.github.com/pvginkel/56658191c6bf7dac23b3893fa59a35e8を参照してください。Dispose()File.Open()using

于 2013-06-26T11:25:15.797 に答える
-1

あなたのソリューションは問題ないようです。「using」ステートメントを使用することもできます。

using (FileStream stream = new FileStream()) 
{
       try {
       stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read);
       }
        catch { return false; }
}

コンパイラはこれを try/finally ブロックに変換し、ブロック コードの実行後にオブジェクトを自動的に破棄します。

File Open は、読み取り/書き込み用にのみファイルを開きます。

ReadAllText は、ファイルを開いてテキストを読み取って閉じるため、時間がかかります。; ケースに適した方法を選択するのはあなた次第です。

于 2013-06-26T11:25:01.203 に答える