Windowsでinotifyのようなものはありますか?


102

Linux OSでは、ファイルシステムへの変更をアプリケーションに通知するionotifyサブシステムがあります。

しかし、私は主にWindowsユーザーなので、ファイルシステムの変更を監視する同様の方法があるかどうか疑問に思っていましたか?


9
私はそのような質問が話題から外れているとは思わない。質問は、どのツール/ソフトウェアライブラリでも大きく異なるOS APIを求めます。特定のファイルが変更されたときにWindowsアプリケーションで通知を受け取る方法のように、異なる言い方をすることができます。
balki 2017年

1
再開するための投票:特定のオペレーティングシステムAPIに匹敵する代替手段を求めている質問で、「私はイギリスから来て、フォークを使って食べ物を食べるところですが、日本では、どのような道具を同じように使用していますか? 」そのアナロジーを使用して受け入れられた答えは「箸を使う」です。
David

回答:



42

.netを使用している場合は、を使用しますFileSystemWatcher。詳細はこちら:http : //msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

あなたが使用している場合はC、使用することをFindFirstChangeNotificationFindNextChangeNotificationReadDirectoryChangesW。詳細はこちら:http : //msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

OSX、関連するAPIがあるfseventsAPI。

それらはすべて微妙に異なり、エッジのケースでは信頼性に問題があります。一般に、すべての変更を100%完全に表示するために、これらのAPIに依存することはできません。ファイルシステム監視を使用するほとんどの人は、定期的なスキャンと組み合わせて、Push APIからの失われた情報や不完全な情報を補正します。


6
「inotifyのエッジケースでの疑わしい信頼性」について少し引用していただけますか
ファラウン

18
fsウォッチャーAPIのコンシューマーが他のプロセスがイベントを生成するよりもイベントの読み取りが遅い場合、カーネルは他の(おそらくより高い優先度の)プロセスでのファイルシステムの変更を保留するか、バッファーの無制限の拡張を可能にする必要があります。inotifyのバッファの深さ(manページに記載されている)は、/ proc / sys / fs / inotify / max_queued_eventsによって制御されます。これを超えると、IN_Q_OVERFLOW通知が表示されます。これは問題ありませんが、場合によっては、再スキャンが必要になる可能性があります。
blucz 2010

ああ、そうです。最近、キューで読んでいました。このエッジケースは、監視しているファイルの数に依存すると思います。また、すべての変更を追跡することが重要であるか、またはいくつかのファイルを見逃す可能性があるかにも依存します。しかし、それは良い点です。ありがとう:)
ファラウン

@blucz私はカーネルの人々がこれらの状況をどのように解決するのか自分自身に疑問を抱いていました。彼らがこれを行うことを知っておくと、設計と実装に自信が持てます。
n611x007 2013年


11

JNotifyまたはMicrosoftのFileMon


8
JNotifyは、プラットフォーム間の互換性が必要だったので、私にとっては完璧でした。JAVA_HOMEが正しく設定されていることを前提として、cygwin、mac、およびlinuxで機能する単一のbashスクリプトを作成することもできました。これは、「自分のファイルを削除しました!」という顧客のマシンでの問題のデバッグに非常に役立ちます。私は実際にログを見て、それがどのように/いつ起こったかを理解することができます。
cmyers 2012

1
FileMonはProcessMonitorになりましたtechnet.microsoft.com/en-us/sysinternals/bb896645
MECU

10

少し遅れますが...

WindowsにはOSXイベントと同様の機能があり、アプリを実行せずにイベントを監視できます。Windows USN Journalは、すべてのファイル変更を追跡します。Jeffrey Richter(Advanced Windowsの作者)が、MSDN Journalの実用的なサンプルを含む素晴らしい記事を書きました。更新記事 MSJがMSでオンラインでなくなったため、archive.orgからのれました。

USN変更ジャーナルのMSDNドキュメント。

ボリューム全体を監視する必要のあるバックアップツールやインデックスなどのアプリケーションを構築している場合は、USN変更ジャーナルの方がおそらく優れています。


USN Journalはどのように違うのですか、それを信頼してバグのある動作を回避していますかFileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmesと言えば
n611x007 2013年

4
私がこれで作業してから久しぶりですが、FileSystemWatcherやFindFirstChangeNotificationは使用していません。私は、Jeffery Richterの例に大きく基づいて、WindowsイベントウォッチャーをGoで書き始めました。:私はテストのビットからは、OS Xの要旨はこちらでfseventsに似て、岩の固体であり、そして何をミスしないgist.github.com/pkrnjevic/7219861
ピーターKrnjevic

@PeterKrnjevic Jeffrey Richterの記事へのリンクを更新できますか?
SOUser

@ SOUser、MS bitrotにより、記事はarchive.orgからリンクされています。
Peter Krnjevic

3

FileSystemWatcher()は、主に監視バッファのエラー処理が多かれ少なかれ不完全であるため、信頼できません。パスと詳細なエラー処理情報がないため、Microsoftは作業ディレクトリを回復したり、手動でポーリングしたりする方法を提供していません。

このバグ^はwin32に由来するため、JNotify for Windowsも信頼できません。JNotifyはwin32を使用します。したがって、FileSystemWatcher()と同じです。


この「スピード」/「レース」/「オーバーフロー」のような問題を解決するための役割をどのように設計するかを考えて、カーネルがどのようにそれを実行したのか疑問に思いました。面白い。このことは、ネットワークとロギングでも発生します。この問題に名前はありますか?
n611x007 2013年

はい、名前は「バグ」です。このバグ(win32)は、これまでにマイクロソフトが作成したすべてのオペレーティングシステムに残っています。このため、Microsoftオペレーティングシステムはファイル監視タイプのソリューションには適していません。あなたはそれを達成するために* nixに行かなければなりません。セキュリティ上の理由から、このバッファオーバーフローを意図的に残したと思うことがあります。
Phillip Brandon Holmes

haha ..ええ..マイクロソフトのファイルシステムが意図的に監視されないように、その名前は意図的なクラスタークラッジです。これは、セキュリティ上の懸念により彼らが残したバグです。
フィリップブランドンホームズ

1

私は少し検索しましたが、Windowsでも同様のものが表示されたことを思い出しました。FileSystemWatcher for .NET があり ます。主にNTまたはXP以降で使用されます。


より一般的にはNTFSファイルシステムでのみ利用可能であり、FAT16、FAT32、または新しいexFATでさえ利用できません。
Mastacheata

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.