2016-08-10 8 views
0

私は現在、私が直面している問題を理解しようとしています。私は次のコードを持っています:File.Createを使用していてもファイルに追加することはできますか?

using (FileStream sw = File.Create(mypath)) 
{ 
    sw.Write(source, 0, bytesRead); 
    sw.Flush(); 
} 

これは、(同時に)複数の時間を実行できるWebサービスで使用されます。

私が直面してる問題は、私は急に(したがって、元のコンテンツがファイル内に2倍された)重複コンテンツを持っていた一つのファイルを持っていたということです。

私は問題が再現できないので、File.Createを使用してストリームを作成したにもかかわらず、基本となるメソッドへの別の呼び出しでコンテンツが生成される可能性がある(マルチスレッドで)可能性があります。上書きされたコンテンツの代わりに追加されたコンテンツ?

編集: それは頼まれたとおり、私は複数の呼び出しが可能になり得るかについてもう少し説明しようとしています。

サードパーティ製のツールは、重要なファイル(.xmlファイル)を作成し、サーバーにそれらを転送するために自分のWebサービスを呼び出します。何らかの理由で転送が失敗した場合、サードパーティのツールは転送を再試行します。私は複数の転送試行をログ内で数分以内に見ているので、私は最初の呼び出しには時間がかかり、2番目の呼び出しが来るということです。最初のものがまだ続いているとき。したがって、彼らはお互いに重複しています(悲しいことに、私は利用可能なログを持っているかどうかの証拠は見つけられません。したがって、最悪の場合のシナリオ、つまり重複して、質問)。 Write -methodへお電話の前に

+2

_ _「複数の時間に実行することができます」 - とさえ同じ 'mypath'ですか?それは単にバグでしょう。 –

+0

yeppと同じmypath。私は予期せぬことがC#/ asp.net私は直面しているかどうか、または作成プログラムがすでにエラー(したがって、Webサービスを呼び出し、ソースを送信したプログラム)を修正しようとしています。ログから得たものから、ストリームがすでに閉じられているかどうかは、2番目または3番目が開かれたかどうかを実際には知ることができません。 – Thomas

+0

いずれにしても、これを防ぐ必要があります。それを修正しないでください。 –

答えて

0

場所sw.Seek(0, SeekOrigin.End);。これにより、カーソルがストリームの最後に移動します。

しかし、あなたはどこで、「追加」すべきである「切り捨て」しているので、あなたの問題ではありません。あなたは上記のコードをスレッドセーフとして設計する必要があります。

private readonly object _lock = new object() 

public void SaveToFile(string fileName, byte[] data) 
{ 
    lock(_lock) 
    { 
     using(FileStream sw = FileStream.Create(fileName)) 
     { 
      sw.Write(data, 0, data.Length); 
     } 
    } 
} 

ロック・ブロック性を保証、同じハンドル(_lock)を使用しているコードは、同時に実行されることはありません。これを実現する最も簡単な方法は、ロックハンドルを導入することです。

プロティップ:あなたは(使用してブロックを使用して)ストリームを配置しているので、あなたはneccessarilyそれが;-)フラッシュする必要はありません

+1

Seek()もスレッドセーフではありません。このファイル操作をスレッドセーフにすると、シークが不要になります。 –

+0

そうです、ヘンク。私は私の答えを更新しています。 – Georg

+0

@georg本質的に私は.writeと.flushを書きませんでした。代わりに私は書き込みブロック(バッファリングされている)を使用しているブロック内のフリーウェアツールを呼び出して、そこにある2つのコマンドを使用しています。私は彼らが誰かがそこにブロックを使用していない場合には、セーブ側になるように.flushでそれを書いたと思います。だから、それは絶対に不必要(私が知っている)ですが、私はフラッシュを取り除くことができません^^ '(私がそのサードパーティのフリーウェアツールを変更できないので) – Thomas

関連する問題