5

ディレクトリ内の一連のファイルを処理するユーティリティがあります-プロセスは比較的遅い(そしてファイルがたくさんある)ため、「最後に」を持つファイルのみを処理することでプロセスを最適化しようとしました最終処理日より後で変更されました」。

通常、これはうまく機能しますが、ファイルをコピーしても最終更新日は変更されないため、変更された特定のファイルがプロセスによってスキップされるファイルのコピーに関するさまざまなシナリオがあることがわかりました。たとえば、次のようになります。

  1. ユーザーは 9:00 にディレクトリを処理します。
  2. 次に、ファイルがこのディレクトリからコピーされ、最終変更日が 9:30 になるように変更されます。
  3. その後、ディレクトリは 10:00 に再度処理されます
  4. 変更されたファイルは、10:30 にディレクトリにコピーされます。
  5. 最後に、ディレクトリは 11:00 に再度処理されます

指定されたファイルの変更日は 9:30 で、ディレクトリが最後に処理されたのは 10:00 であるため、ファイルはスキップされるべきでない場合にスキップされます。

残念ながら、上記は特定の状況 (ソース管理などの共同作業環境など) で非常に頻繁に発生する傾向があります。明らかに私の論理には欠陥があります。私が本当に必要としているのは、「最後に変更またはコピーされた」日付です。そのようなものは存在しますか?

それに失敗した場合、特定のファイルが変更されたかどうかを合理的な信頼性で迅速に判断する別の方法はありますか?

4

5 に答える 5

3

このクラスを使用してFileInfo、必要な変更情報 (既に使用している可能性があります) を取得できます。ファイルの 2 つのプロパティ ( と ) を確認する必要がLastWriteTimeありCreationTimeます。いずれかが最終処理日よりも後の日付である場合は、ファイルをコピーする必要があります。CreationTime常に より小さいというのはよくある誤解ですLastWriteTime。そうではありません。ファイルが別のファイルにコピーされた場合、新しいファイルはLastWriteTimeソースの を保持しますが、CreationTimeはコピーの時点になります。

于 2010-09-30T06:54:22.843 に答える
0

これまで見てきたように、ファイルを既存の宛先ファイルにコピーすると、既存のファイルの CreationTime が保持され、LastWriteTime がコピー時の現在のシステム時間ではなく、ソース ファイルの LastWriteTime に設定されます。考えられる解決策は次の 2 つです。

  1. コピー先の CreationTime がシステムの現在の時刻になるように、削除とコピーを実行します。
  2. ファイルのA rchived 属性も確認し、処理中にクリアします。source->dest をコピーすると、dest +A 属性が設定されます。
于 2010-09-30T08:10:09.950 に答える
0

代わりに、ディレクトリを監視するプロセスを追加することを検討しましたか? FileSystemWatcher を使用していますか? 次に、ファイルを監視するためのバッチ プロセスとリアルタイム システムの使用から移行します。

于 2010-09-30T06:38:01.113 に答える