2011-01-20 6 views
3

書き込まれるとすぐにディレクトリからファイルを読み込む必要があるプログラムがあります。 FileSystemWatcherを使ってディレクトリの変更を通知します。どのような変更があったのかをイベントで確認するのではなく、ファイルをリストして、見つかったすべてのファイルを処理し始めます。問題は、いくつかのファイル、200で約1のために、プログラムはすべてゼロを読むことである書き込み直後のファイルの読み込みすべてゼロ(.net)を取得

try { 
    fs = fi.Open(FileMode.Open, FileAccess.ReadWrite, 
        FileShare.None); 
    message = new byte[fs.Length]; 
    int br = fs.Read(message, 0, (int)fi.Length); 
} 
catch (Exception e) { 
    // I'll get it next time around 
    return; 
} 
finally { 
    if (fs != null) 
     fs.Close(); 
} 

はまだ私のようなコードを持って書かれているファイルを読み込もうとしないようにするには。ファイルの長さは正しいが、内容はすべてゼロバイトであるように見える。後者のファイルをチェックすると、実際の正しいデータが含まれていることがわかります。私はファイルを開くときにファイルへの早すぎるアクセスを妨げると思った。

DOSコマンド 'copy InFile_0 * dropdir'(実行ごとに約100ファイル)を使用してディレクトリにファイルをコピーすることでテストします。このコマンドは、コピーを2つのステップで実行します.1)スペースを埋めると私のプログラムは時々2つの途中で飛びます。

これをコード化する方法に関するアイデアはありますか?

更新:私は書き込みプログラムを制御できません。それは何でもかまいません。私は防衛的にコードする必要があるように見えます。

+1

ヒント:例外のログを追加します。静かに失敗しないでください。 – Amy

+0

ファイルにロックをかけないプログラムで作業しています。例えば、Cプログラムでは一般的に、fopen()はファイルをオープンしている間にどのプログラムでも読み書きができるようにします。「しばらく待って」を超えて勝つ方法はたくさんありません。 –

答えて

2

あなたは競合状態になります。あなたがそれを決定的に修正しない限り、ここでは(ネットワークファイルシステムなどで)悪化するだけです。

"whatever.tmp"という名前を使用してファイルを書き込むようにしてから、名前を変更して名前を変更してください。読み取り時に.tmpファイルを無視します。

または、「センチネル」などの長さのゼロのファイルをディレクトリに保存してください。別のファイルが正常に書き込まれた後に、センチネルファイルを書き換えるためにファイルを書き込むプログラムを取得します。その後、変更日付/時刻がセンチネルファイルの変更日時であるファイルを読み取ろうとしないでください。

ファイルの作成者を制御できない場合は、各ファイルの変更日時を現在のシステム日時と照合してください。ファイルを読み込もうとする前に、ファイルのサイズを適切なものにします(小さい場合は数秒、大きい場合は長くします)。

幸運。これは首に悪名高い痛みです。

1

まあ、私は@Ollie Jonesの以前の投稿に同意しません。

既にファイルへの排他アクセスを確立しているため、競合状態の問題は発生していません。

あなたは作者の行動をより慎重に調べるべきだと思います。

fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

これは、読み込みに失敗する可能性がありますが、書き込みエラーを減らすことができます。安全に読み込むタイミングを決めるには、ファイルの時間やファイルサイズなどを調べることができます。その後多くのファイルが書き込まれると、2番目のファイルが作成された後に最初のファイルの読み込みを開始できます。

+0

私はもともとFileAccess.Readを開き、ゼロのファイルで同じ問題を抱えていました。 .ReadWriteを開こうとすると、それを修正しようとしていました。私は書き込みアクセスを求めると、すべての作家が実際にそれを完了するまで、ファイルへのアクセスが遅れるかもしれないと思っていました。 – TomU

+0

FileShare.ReadWriteがどのように問題を解決するのか分かりません。 .Noneよりも許容度が高く、私はあまり許されていません。加えて、ドキュメントは "後に開く"と言う - 私の後に来るプロセス。私は作家に続いているので、私は作家が「No」で開かれたことを望みます。しかし、私はそれを支配していません。もちろん、ドキュメントを誤って解釈している可能性があります。あるいはドキュメントが間違っている可能性があります。 – TomU

関連する問題