0

アプリケーションが実行されていない間に特定のディレクトリで発生した変更を確認するにはどうすればよいですか? ディレクトリにはディレクトリとシンボリック リンクのみが含まれますが、ユーザーが新しいファイルをディレクトリにコピーするか、新しいサブディレクトリを作成するたびに、アプリケーションはそれを処理する必要があります。特に、アプリケーションが実行されていないときにこの変更が発生した場合。最初の単純な方法は、ディレクトリとファイルリスト全体をどこかに保存し、アプリケーションの次の起動時にディレクトリ全体を再度クロールして、保存した状態と比較することですが、それには時間がかかります。サブディレクトリごとにハッシュを作成し、ハッシュのみを比較する方法はありますか? これはより速い方法でしょうか?このタスクのベスト プラクティスはありますか?

敬具

4

1 に答える 1

0

FSEventsのドキュメントを参照してください。ポイント 3. 問題と考えられる解決策について説明します。

FSEventStreamStart() -> ストリームの作成時にクライアントから提供されたコールバックを使用して、クライアントの実行ループからイベントの受信と処理を開始します。sinceWhen パラメーターに値が指定されている場合、最初に「履歴」イベントがコールバックを介して送信され、次に HistoryDone イベントが送信され、次に「現代」イベントが継続的に送信されます (sinceWhen に kFSEventStreamEventIdSinceNow を指定したかのように)。

作成時に目的のディレクトリを指定すると、そのパスの下またはそのパスで発生した履歴イベントのみが取得されます。

FSEventStreamRef FSEventStreamCreate(
   CFAllocatorRef allocator,
   FSEventStreamCallback callback,
   FSEventStreamContext *context,
   CFArrayRef pathsToWatch,
   FSEventStreamEventId sinceWhen,
   CFTimeInterval latency,
   FSEventStreamCreateFlags flags);

を指定する必要がありますFSEventStreamCallback。このコールバックは、送信されたパスの配列とそのパスのイベント フラグを取得します。その後、イベントをふるいにかけることができるはずです。を参照して、FSEventStreamEventFlags必要なものを選択してください。

File System Events Programming ガイドも参照してください。あなたの正確な問題を扱うセクションがあります。そこで提案されているのは、イベント システムを階層キャッシュと組み合わせることです。

于 2012-11-14T15:52:24.040 に答える