2012-12-04 19 views
6

私は頭痛を与えている次のコードブロックを持っています。FileStream読み書き用にファイルをロックするC#

私は、usingステートメント内でロックを提供するfilestreamを使用しているため、論理的にはうまくいくはずです。 StreamWriterを作成する行に到達すると、「ファイルは書き込み可能ではありません」というメッセージが表示されません。

私のプログラムはマルチスレッドアプリケーションです。どのスレッドもこのファイルに書き込もうとしている可能性があります。私はファイルをロックし、内容を読み、内容を確認し、変更を書き戻すプログラムが必要です。そのプロセス中に、他のスレッドはそのファイルにアクセスできません。

using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
{ 
    var sr = new StreamReader(fs); 
    var str = sr.ReadToEnd(); 
    var strArray = str.Split(','); 
    if (strArray.Any(st => st == text)) 
    { 
     return; 
    } 
    sr.Close(); 

    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

答えて

6

FileShare.Noneフラグは、それだけでファイル、あなたが得るので、例外をロックし、スレッドがキューイングされることはありません。相互に排他的なアクセスを提供するために、共有オブジェクトを書き込み前にロックすることができます。

しかし、これは「今私のプログラムはマルチスレッドアプリケーションで、スレッドはこのファイルに書き込もうとしている可能性があります」と言っています。さて、これらのスレッドはまったく同じメソッドを使ってファイルに書き込みますか?私はに関するいくつかの仮定を行った

lock (lockObject) 
{ 
    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

...ここでそれを使用し

private static object lockObject = new object(); 

...

は、静的クラス変数を作成します...そして、これは動作するはず、のは、彼らが行うと仮定しましょうこれはうまくいかない場合、または私たちにいくつかの情報を提供する場合は、同期に関する情報を参照する必要があります。

さらに先にStreamReaderを終了してください(以前の方法で返される場合)。それを使用した直後に閉じます。

関連する問題