2011-10-24 28 views
10

ファイルがまだ存在しない場合は作成します。
のようなコード:ファイルが存在しない場合にのみ作成する

if (!File.Exists(fileName)) 
{ 
    fileStream fs = File.Create(fileName); 
} 

ファイルは「もし」を「作成」の間に作成される場合には競合状態のため、それはオープンにしてください。

どうすればよいですか?

EDIT:
それは異なるプロセス(同じアプリケーションの複数のインスタンス)ですので、ここでは使用することはできませんロック。

+0

try {} catch {}? – ojlovecd

+0

同じアプリケーションですか?ミューテックス? –

答えて

9

私が必要としていたKristian Fennの答えは、FileModeとはまったく同じでした。これは私が探していたものです:

FileStream fs = new FileStream(fileName, FileMode.CreateNew); 
1

ファイルを作成しようとする競合が同じプロセス内にある場合は、コードの周囲にlockステートメントを使用して競合を防ぐことができます。

File.Createを呼び出すときに例外が発生することがあります。その例外を適切に処理するだけです。スローされた例外が比較的高価であるため、ファイルが存在するときに例外を処理する場合でも、作成前にファイルが存在するかどうかを確認することをお勧めします。競争状態の確率が低い場合にのみ、それは推奨されない。

+1

私が使っているソフトウェアは書かないことをお勧めします。推測の上で安全を保証してください。 – reinierpost

19

また、複数のスレッドが、おそらく例外を取得しますファイルにアクセスしようとするかのようにしかし、あなたがスレッドロックになっているはずです

FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate); 

を使用することができます。

+0

MSDNは、そのコンストラクタがスレッドセーフであるかどうかを明記していないため、マルチスレッド環境では注意が必要です。 –

+1

2つのスレッドが同時に実行しようとすると、['CreateFile'](http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx)と同じ結果が得られます(' FileStream'コンストラクタはWin32上のラッパーです)、同時に呼び出されます.1つのスレッドが勝ちます。私が理解しているように、カーネルレベルでは、これは単一の操作です。一方のスレッドは作成されず、もう一方のスレッドは作成されません。 – Richard

+0

リチャードに感謝します。 –

1

まず、ロックまたはMonitor.EnterまたはTryEnter APIを使用して、コードの一部をロックします。 FileMode.OpenOrCreate APIでFileStream APIを使用することができます。ファイルが存在する場合は、ファイルを使用するだけです。それ以外の場合は作成します。

3

これは良い解決策ではありません。また、using(var stream...)に注意してください。ストリームを閉じてIO例外を回避するために使用します。

if (!File.Exists(filePath)) 
{ 
    using (var stream = File.Create(filePath)) { } 
} 
関連する問題