30

特定のディレクトリの下にあるファイルが (直接的または間接的に) 変更されたときにコードに通知されるようにします。「変更」とは、ファイルの内容が変更されたり、名前が変更されたり、削除されたりするたびにコードに通知することを意味します。または新しいファイルが追加された場合。私のアプリケーションでは、何千ものファイルが存在する可能性があります。

私は FSEvents のように見えましたが、その技術概要には次のように書かれています。

注目すべき重要なポイントは、通知の粒度がディレクトリ レベルであるということです。ディレクトリ内の何かが変更されたことだけが通知され、何が変更されたかは通知されません。

また、次のようにも述べています。

また、ファイル システム イベント API は、特定のファイルがいつ変更されたかを検出するようには設計されていません。このような目的には、kqueues メカニズムの方が適切です。

ただし、特定のファイルで kqueue を使用するには、ファイルを開いてファイル記述子を取得する必要があります。何千ものファイル記述子を管理するのは現実的ではありません (また、オープン ファイル記述子の最大許容数を超える可能性があります)。

不思議なことに、Windows ではこのReadDirectoryChangesW()関数を使用できます。

では、Mac OS X で私が望むことをどのように行うことができるでしょうか? または、別の方法で尋ねられました:ReadDirectoryChangesW()ユーザー空間で Mac OS X に相当するものを作成するにはどうすればよいでしょうか (非常に効率的に行います)。

4

4 に答える 4

8

編集: 検証されていませんが、Konstantin は、このコード サンプルが 2012 年の時点で廃止されていることを以下に示しています。

あなたが探しているもののための特定の API があるとは思いません。Apple は、Watcherと呼ばれる同様の問題のサンプル コードを提供しています。それはあなたが探しているものではありませんが、現時点でできる最善のことです。ディレクトリのスナップショットを作成し、何か変更があった場合は再スキャンする必要があります。もちろん、変更時間を信頼できる場合は、変更時間を確認するのが最善です。

無制限の数の kqueues に登録しようとすると、おそらくうまくいかないでしょう。

于 2009-11-23T05:05:10.753 に答える
7

私はこれを自分で試したことはありませんが、FSEvents は 10.7 (Lion) の時点でファイルレベルの通知を提供できるようです。FSEventStreamCreateFlags の説明から:

kFSEventStreamCreateFlagFileEvents

ファイル レベルの通知を要求します。ストリームは、ディレクトリ レベルの通知のみを受け取るのではなく、監視している階層内の個々のファイルに関するイベントを受け取ります。このフラグを使用すると、使用しない場合よりもはるかに多くのイベントが生成されるため、注意して使用してください。

OS X v10.7 以降で利用できます。

于 2014-05-27T14:23:11.957 に答える
2

Mac OS X でのニーズに最も近い (私が知っている) ユーティリティはfslogger. 説明、dmg、およびソース コードについては、次のリンクを参照してください: OSXBook - fslogger

于 2011-09-02T03:48:47.500 に答える
-2

をチェックアウトすることをお勧めしますがman fs_usage、これはディレクトリに固有のものではなく、root 権限が必要です。

于 2010-06-15T06:04:32.717 に答える