4

それで、何が良いですか?このような構造を使用するには:

if (File.Exist(fileName))
{
    // do something with file...
}

ただの

try 
{
    // do something with file.
}
catch(Exception ex)
{
}

メソッド File.Exist() を使用するにはコストがかかりますか?

ありがとうございました!

4

5 に答える 5

11

前者には競合状態がありますFile.Exists。 が true を返した後、ファイルを開く前に、別のプロセスがファイルを削除する可能性があります。後者はそうではありません。事前に確認したとしても、存在しないファイルを無視したい場合は例外をキャッチする必要があります。

したがって、どちらかである必要があります

if (File.Exists(fileName))
{
    try
    {
        // ...
    }
    catch (FileNotFoundException)
    { }
}

また

try
{
    // ...
}
catch (FileNotFoundException)
{ }

前者はチェックを複製し、ファイルがネットワーク共有上にある場合は遅くなる可能性があり、後者は非例外的な条件に対して (処理される) 例外を発生させ、デバッグを複雑にします。どちらにもメリットがあります。個人的には後者を選ぶのが一般的ですが、どちらでも構いません。

于 2012-11-23T12:27:52.920 に答える
5

例外は、アプリケーションのフローを処理するために使用されることは想定されていません。例外を回避し、実行フローの通常の部分として例外を予期しないようにすることを目的としています。

99.999%のアプリケーションでは、パフォーマンスに違いがある場合、それは認識できません。ファイルがそこにあるはずで、見つからないことが例外的なシナリオである場合は、 try catchブロックを使用できます。そうでない場合は、File.Existアプローチを選択する必要があります。

于 2012-11-23T12:25:20.143 に答える
1

プログラム フローと実行中のアクションによって異なります。ファイルが存在すると予想される場合は、例外処理に頼ることができます。これは、存在しないとプログラムを続行できず、呼び出しチェーンの上位で例外を処理する必要がある可能性が高いためです。

それ以外の場合、True|False|FileNotFound問題のメソッドがReadFile().

File.Exists を使用してファイルを「安全に」開くことは、ほとんど役に立ちません。このことを考慮:

public String ReadFile(String filename)
{
    if (!File.Exists(filename))
    {
        // now what? throw new FileNotFoundException()? return null?
    }

    // Will throw FileNotFoundException if not exists, can happen (race condition, file gets deleted after the `if` above)
    using (var reader = new StreamReader(filename))
    {
        return reader.ReadToEnd();
    }
}

ファイルにデータを追加する場合は、ファイルが存在するかどうかを確認したいという人もいるかもしれませんが、StreamWriterコンストラクターにはappendパラメーターを使用したオーバーロードがあり、存在しない場合はライターがファイルを作成して追加できます。もしそうならそれ。

したがって、おそらく問題は、次のような方が適切かもしれませんFile.Exists。幸いなことに、その質問はすでに尋ねられ、回答されています

于 2012-11-23T12:27:18.180 に答える
0

最初のケース-

if (File.Exist(fileName)) //A single statement to check and proceed. 

後者の例外処理方法には以下が含まれます-

例外objectが発生した場合に作成され、対応するcatchブロックに渡される例外クラスの1つ。

実行フローの処理に例外処理を使用するのは得策ではないため、最初の方法をお勧めします。

于 2012-11-23T12:35:06.020 に答える
0

まず、ファイルが存在するかどうかを確認し、存在しない場合は例外をスローします。

その後、try-catch ブロックを使用して、スローされる可能性のある他の例外 (アクセス許可など) を処理します。

if (!File.Exist(fileName))
{
    throw new ArgumentException("filename");
    // or throw new FileNotFoundException("filename");
}


try 
{
    // do something with file.
}
catch(Exception ex)
{
}
于 2012-11-23T12:29:56.197 に答える