2017-11-17 14 views
0

私にherehere、おそらくhereのリンクがあります。.NETコア2.0を使用してWindows上のファイルの変更を監視する

私は、特定のファイルの変更を監視するサービスを作成したいと思います。私は、POCを続けるためにディレクトリを監視するコンソールアプリケーションを作成する最も簡単なことから始めました。しかし、私は実際に行われた変更を抽出しようとしていました。 (はい、私はFileSystemWatcherクラスのイベントを処理することができましたが、クラスのAPIを見る限り、私は実際の変更を追跡することができません)

そうする方法があるかどうか知っていますか?たぶんあまり痛みや不必要な操作なし。

現在、.NET Core 2.0を使用していますが、.NET Coreのどのバージョンでも対応します。

EDIT:私が監視する必要があるファイルはテキストベースですが、基本的にはgit diffの機能を実装して変更を報告します。

+2

ファイルにどのような「変更」がありますか?これはバイナリファイルかプレーンテキストですか? "teh"を "the"に変更することは、バイナリファイルの途中で001010を110101に変更することとは異なります。まあ、最低レベルではありませんが、あなたは精緻化すべきです。 – Patrick

+2

良い点は、テキストベースのファイルについてのみ話しているので、変更があれば、後で関連する変更のみをトラッキングする方法を実装することができますが、これは別のトピックです正確にgit diffのように) – kuskmen

+0

https://jeremylindsayni.wordpress.com/2016/04/10/how-to-use-the-filesystemwatcher-in-c-to-report-file-changes-onを見ましたか? -disk/ – Patrick

答えて

3

短い答えはいいえ、ファイルのどの部分が変更されたかを示すAPIはありません。 OSから取得できるのは、ファイルに変更が加えられたことの通知であり、変更の性質や場所はFileSystemWatcher以外のものではありません。

変更の性質を検出するには、変更前と変更後のファイルの内容を比較できる必要があります。ほとんどの場合、ファイルの以前の状態にアクセスすることはできません。シャドウコピーを使用してファイルの以前の状態にアクセスできますが、それ自体に問題があります。

少数のファイルしか監視していない場合は、何らかの種類のフィンガープリンティング(ブロックレベルのハッシュなど)を行って変更の場所を検出できます。特定の変更を検出するには、前と後が必要です。言っ

は...

実際にディスクにデータを書き込むために使用されているWindowsのAPIにフックする原理的には可能です。 .NETでこれを試したことはありませんが、これまで同様のことを行うにはDetoursを使用しました。 APIのフックは危険な領域であることに注意してください。間違っていると、コンピュータを強制終了できます。ここは龍です。このルートに行きたい場合は、遅延を最小限に抑えるためにコードを記述することを強くお勧めします。

関連する問題