2012-02-09 19 views
4

C#(.NET Webサービス)でファイルを作成していて、既存のファイルを上書きしたくありません。既存のファイルのCreateNewを使用したFileStreamコンストラクタでC#で例外がスローされる

方法はFileMode.CreateNewセットでのFileStreamを構築することであると考えられます。ファイルが存在する場合、実際には例外がスローされます。

しかし、どのようにファイルの作成によってスローされた他の可能性のある例外とは対照的に、私はこの例外を認識していますか? http://msdn.microsoft.com/en-us/library/47ek66wy.aspxのドキュメントには、このケースが「IOException」として記載されています。

私はIOExceptionを捕まえて、次にFile.Existsを実行するという答えですか?

+1

例外からエラーコードを使用できます。 「[System.IO.IOExceptionのHResultを決定するにはどうすればよいですか?]」(http://stackoverflow.com/questions/991537/how-do-i-determine-the-hresult-for-a-system-io- ioexception)ファイルが存在する場合は0x80070050になります。 –

+0

@DmitryShkuropatsky:あなたはおそらくその答えを – Guvante

答えて

5

次のように例外からのエラーコードを取得することができます:それは0x80070050になりますファイルの場合

int hr = Marshal.GetHRForException(ex); 

が存在します。

+0

私はよりきれいな答えを期待していましたが、現実はこれとほぼ同じであると予想していました。これは正しいアプローチと私が取るようなものです。ありがとう、ドミトリー。 – dkeisen

0

私は、File.Existをまず実行してから、例外をキャッチします。そうすれば、ファイルがすでに存在しているために例外が発生しないと確信できます。

+3

にするべきです。それはまったく真実ではありません。技術的には、チェックと例外処理の間に作成することができます(まれですが、それでも可能です)。 – colithium

+0

まあ、そうです。技術的には、サービスはInstanceContextMode.Singleを変更することができ、さらに彼はサービス外のファイルに何が起こるかも言わなかった。 – veblock

0

私はFile.Existsメソッドが最もエレガントだと思います。あなたは根本的な原因を推測して推測するためにリフレクションで遊ぶことができますが、それは価値がありません。 InnerExceptionがより明確なものに設定されている可能性があります。それはヌルですか?

とメッセージプロパティは、正確に何が起こったのか(英語またはあなたが使用しているものは何でも言語)を記述しなければなりません。 Messageによって返された文字列に依存することも良い考えではありません。

私は正直言ってあなたのアイデアが気に入っています。

0

最良の方法は、私は信じて、あなたがたFileStreamを作成しようとする前にFile.Existsを使用することです。例:

if (File.Exists(path)) 
{ 
    //Handle existing file 
} 
else 
{ 
    FileStream newFile = new FileStream(path, FileMode.CreateNew); 
    //Logic to do with your new file 
} 

IOExceptionを解析して、正しい「正しい」IOExceptionであることを確認しようとすると、脆弱です。私はそれを行う唯一の方法は、IOExceptionのコメントまたは記述を比較することだと信じています。

+1

これは残念です。私は、チェックと作成の間にウィンドウを残したくないので、File.Existsメソッドを使用したくありませんでした。脆さは正確に私が尋ねた理由です:私はメッセージフィールドをチェックすることが正しい答えになることはできません。 – dkeisen

+1

ええ、私はあなたの心配を参照してください。私はあなたがファイルをチェックするときと作成するときの間にギャップがないことを確実にする方法を知らない。それは脆く見えるかもしれませんが、私はCreateNewから来る例外メッセージが変わる可能性が高いとは考えていません。ギャップが絶対に必要ない場合は、メッセージを比較するだけですが、これを適切に文書化してください。通常の実行の一部として例外をキャッチすることはお勧めしません。したがって、File.ExistsとIOExceptionのメッセージをチェックするtry-catchを実行することをお勧めします。このように、99%のケースでFile.Existsが十分にあなたに通知します。 – Daryl

関連する問題