11

File.Deleteのfinally節には次のようなものがあります:

finally
{
    //remove the temporary file
    if(File.Exists(transformedFile))
        File.Delete(transformedFile);
}

C#のドキュメントによると、存在しないファイルでFile.Deleteを呼び出しても、例外はスローされません。

ラップを削除しても大丈夫File.Existsですか、それとも追加の例外が発生する可能性がありますか?

4

6 に答える 6

14

必要な場合は、存在確認後にファイルが削除される可能性があるため、不十分です。このような場合のベストプラクティスは、単にファイルを削除することです。「ファイルが見つかりません」タイプのエラーで失敗した場合は、ファイルが存在しなかったことがわかります。これにより、余分な操作が削除され、あらゆる種類のレースウィンドウが回避されます。

于 2013-01-19T01:07:11.593 に答える
10

Exists前にチェックするDeleteことで例外が防止される状況が1つあります。パスが無効なファイル名がある場合、Existsメソッドはを返しますfalse

次に、それはあなたが望む振る舞いに依存します。一部の状況では、無効なパスによって例外が発生する場合があります。

また、ファイルが存在するからといって、(その時点で)いつでも削除できるとは限りません。予期しない問題に対する例外処理は引き続き必要です。

于 2013-01-19T01:08:33.660 に答える
5

File.Deleteを投げませんFileNotFoundException、それは気にしません。パスに存在しないディレクトリがあるため、パスが無効な場合にのみ例外がスローされます。その場合は、がスローされDirectoryNotFoundExceptionます。

このコードは例外をスローしません。

var file = new FileInfo(@"C:\doesnotexist.file11111");
file.Delete();

これは投げますDirectoryNotFoundException

var file = new FileInfo(@"C:\bad.dir\doesnotexist.file11111");
file.Delete();

MSDN File.Delete

于 2015-11-11T19:09:09.933 に答える
1

これを論理的かつ批判的に見てみましょう。MSDN Docoが100%正確ではなく(時折エラーが含まれている)、FileNotFoundException がスローされる可能性があると仮定すると、次のいずれかが原因になります。

  1. そもそもファイルが存在していなかった(ファイルが作成される前に、を終了しtryて入力した)finally

  2. プログラムエラーが発生しました(ファイルパスまたは名前が正しくアセンブルされていません)

オプション#2は発生しないはずだと思われます。それをテストするため、それでも発生する可能性がある場合は、臭いコードがあります。これにより、オプション#1が唯一の実行可能なオプションとして残ります。この場合、例外は気にしないので、それをキャッチして次に進みます。これは、FileNotFoundExceptionがスローされる可能性がある場合でも、特定の質問がほとんど冗長であることを意味します。

ただし...
IMVHOにはまだ2つの例外があり、IOExceptionUnauthorizedAccessExceptionに注意する必要があるため、File.Deleteをtry/catchでラップします。これらのいずれかが発生した場合は、何らかの緩和策を検討する必要があります(おそらく、次回の再起動時に削除するようにファイルを設定するか、何らかの方法でユーザーに通知します)。

于 2013-01-19T01:21:37.690 に答える
1

それでも他のタイプの例外を取得できます。たとえば、ファイルが使用されている場合はIOExceptionです。

したがって、 finallyブロックでファイルを削除することを主張し、例外が発生しないようにしたい場合は、File.deleteの周りに別のtry-catchを配置してください。

finally
{
   try 
   {
     //remove the temporary file
     File.Delete(transformedFile);
   }
   catch
   {
   }
}

ただし、いずれにせよファイルを削除することが目的の場合は、ファイルを排他的に開くとよいと思います。この場合は、最初にファイルを閉じてから削除する必要があります。

于 2013-01-19T01:47:28.287 に答える
0

私は以前にこの質問と同様の質問をしました、そして私はこの結論に達しました:

状況によります。はい、わかっています...本当に簡単な答えではありませんが、状況によってファイルが存在するかどうかを判断するための注意事項や、メソッドtry { ... } catch { ... }の周囲のブロックを確認してください。File.Delete(...)

  • コードはファイルを生成しましたか?その場合、ファイルが存在するかどうかを確認するために実際にチェックを行う必要はありません。
  • 他の問題の処理に関心がありますか?ファイルシステムを使用していることを忘れないでください。MSDNのドキュメントには、他の状況によってメソッドが例外を生成する可能性があることが明確に示されています。
于 2013-01-19T01:32:09.457 に答える