3

FileSystemWatcher を使用して、ドキュメント管理システムから開かれたドキュメントを監視します。ユーザーがドキュメントを保存する場合、システムでドキュメントを更新するかどうかを尋ねます。

Excel 2007 の XLS ファイルに問題があり (問題が 2003 に存在しないことは確認されていませんが、2007 で互換モードで開くファイルのみのようです)、ファイルを開くとすぐに Changed イベントが発生します。何も変更されていないか、ユーザーが閉じるときに保存しないことを選択した場合でも、ファイルを閉じるともう一度。XLSX ファイルを開くとき、この同じ動作は存在しません。

動作を確認するためのテスト アプリを作成しました ( http://www.just2guys.net/SOFiles/FSWExcel.zip )。アプリには、NotifyFilter の種類ごとに 1 つの FileSystemWatcher があるため、Changed イベントが 発生した理由が明確になります。

ドキュメントが実際にユーザーによって何らかの方法で保存されたときにのみ、ユーザーにプロンプ​​トを表示する方法を考えることができますか? Process.Start が呼び出された後にファイルの監視を開始できます。これにより、ドキュメントを開くときにメッセージをスキップできますが、何も変更されていない場合でも、ドキュメントを閉じるときにメッセージが表示されます。

4

3 に答える 3

3

Word でこれに気付きました。簡単に再現できます。

Office アプリケーションで .doc または .xls ファイルを開くと、タイムスタンプがドキュメントを開いた時刻に変更されます。

アプリケーションを閉じると、タイムスタンプは元の値にリセットされます (保存しなかった場合のみ)。

したがって、Office ファイルの場合は、さらに 2 つのチェックが必要です。

  • オープン時、タイムスタンプが現在の時刻に設定されている場合、ファイルを排他的に開くことができることを確認します

  • 閉じる時に、タイムスタンプが現在の日付と時刻に「近い」かどうかを確認するか、ファイルのアーカイブフラグを確認します

于 2010-03-08T20:23:30.147 に答える
1

通常、ファイル システム ウォッチャーは悪です。ファイルが完全に書き込まれる前にイベントを登録するため、多くの人がやけどを負います。

スリープ ループ パターンの代わりにそれを削除するか、アクションを実行する前に静的な遅延 (Thread.Sleep) を追加するか、または 2 つの組み合わせ (イベントの受信、スレッドの生成、およびループ) のいずれかによって、この問題を回避することができました。最後の変更日時を確認して、何も更新されていないと思うまでスレッド内で)。

于 2010-03-08T20:30:29.573 に答える
0

Excel は、ファイルを開くたびに一時ファイルを作成します。これはおそらく、表示されているイベントです。FileSystemEventArgs の Name プロパティを確認し、ファイル名が「~」で始まる場合はイベントを無視します。

于 2010-03-08T18:33:01.400 に答える