1

現在、2 つの Windows サービス (C#) の設計を改善しようとしています。サービス A は、データ エクスポート (csv ファイル) を生成し、それらを一時ディレクトリに書き込みます。そのため、ファイルはサブディレクトリである一時ディレクトリに書き込まれます。メイン出力ディレクトリの. 次に、ファイルは ( 経由でFile.Move) 出力ディレクトリに移動されます (書き込みが成功した後)。このエクスポートは、複数のスレッドによって実行される場合があります。

別のサービス B は、定義された間隔でこの出力ディレクトリからファイルを取得しようとします。ロックされたファイルを確実にDirectory.GetFiles()除外する方法。

  1. ここでStream stream = new FileStream("MyFilename.txt", FileMode.Open)説明されているよう に() を使用して新しい FileStream を作成することにより、すべてのファイルをチェックしようとする必要があります。

  2. または、プロデューサー サービス (A) は、適切な検索パターンでコンシューマー サービス (B) によって自動的に除外される一時ファイル名 (*.csv.tmp) を使用する必要があります。移動が完了したら、ファイルの名前を変更します。

  3. このようなファイルのリスト操作を処理するためのより良い方法はありますか?
4

2 に答える 2

0

1 つの方法は、ファイルが使用されている間は書き込みアプリから一時ファイルとしてマークし、書き込まれて閉じられたときにのみマークを解除することです。

FileStream f = File.Create (filename);
FileAttributes attr = File.GetAttributes (filename);
File.SetAttributes (filename, attr | FileAttributes.Temporary);
 //write to file.
f.Close ();

File.SetAttributes (filename, attr);

消費するアプリからは、一時ファイルをスキップしたいだけです。

foreach (var file in Directory.GetFiles (Path.GetDirectoryName (filename))) {
    if ((File.GetAttributes (file) & FileAttributes.Temporary) != 0) continue;
    // do normal stuff.
}
于 2013-02-26T12:20:39.010 に答える
0

チェックを気にしないでください!

は?それはどうしてですか?

ファイルが同じドライブにある場合、移動操作はアトミックです。この操作は実質的に名前を変更することであり、前のディレクトリ エントリを消去し、それを次のディレクトリに挿入し、データを書き換えずに、データが実際に存在する同じセクタ (またはその他のもの) を指します。ファイル システムの内部ロック メカニズムは、ディレクトリ スキャンが破損した結果を返さないように、このプロセス中にディレクトリの読み取りをロックおよびブロックする必要があります。

つまり、ディレクトリに表示されるまではロックされません。実際、ファイルは、前のディレクトリに書き込みを行ったクローズ操作以降、開かれたり変更されたりしていません。

警告- (1) サブディレクトリとしてマウントされたドライブ、パーティション、またはその他のメディア間では確実に機能しません。OS は、ディレクトリ エントリの編集ではなく、舞台裏でコピーと削除を行います。(2) この振る舞いはルールではなく慣習です。私は見たことがありませんが、ファイル システムは自由に破壊できます。

したがって、これはおそらく機能します。そうでない場合は、独自の一時拡張機能のアイデアを使用することをお勧めします(これとまったく同じ目的で以前に行ったことがありますが、共有ドライブを介して通信することによってのみ通信できるクライアントとサーバーの間で)、そうではありません一生懸命、完璧に働いた。

あなた自身のアイデアがあまりにもローテクで、同じマシン上にいる場合 (あなたのように聞こえます)、ファイル名が埋め込まれたミューテックス (google that) を設定できます。ライタープロセス; 次に、他のプロセスから読み取っている各ファイルを開くときに、ブロッキング テストを実行します。2 番目のプロセスにできるだけ早く応答させたい場合は、これをファイルシステム ウォッチャーと組み合わせます。次に、一時的なファイル名のアイデアの 10 倍の労力を費やして、余分な利益が得られなかったことに対して、自分を褒めてください >:-}

幸運を!

于 2013-02-26T15:17:56.387 に答える