Surveillance d'un directory dans Cocoa / Cocoa Touch

J'essaie de find un moyen de surveiller le contenu d'un directory pour les changements. J'ai essayé deux approches.

  1. Utilisez kqueue pour surveiller le directory
  2. Utilisez GCD pour surveiller le directory

Le problème que je rencontre est que je ne peux pas find un moyen de détecter quel file a changé. J'essaie de surveiller un directory contenant potentiellement des milliers de files et je ne veux pas appeler stat sur chacun d'entre eux pour savoir lesquels ont changé. Je ne veux pas non plus configurer une source de répartition distincte pour chaque file de ce directory. Est-ce actuellement possible?

Note: J'ai documenté mes expériences en surveillant des files avec kqueue et GCD

Mon conseil est de mordre la balle et de faire un scan de directory dans un autre thread, même si vous parlez de milliers de files. Mais si vous insistez, voici la réponse:

Il n'y a aucun moyen de le faire sans se retrousser les manches et faire du kernel-diving.

Votre première option consiste à utiliser le framework FSEvents, qui envoie des notifications lorsqu'un file est créé, édité ou supprimé (ainsi que des choses à faire avec des attributes). Vue d'set est ici , et quelqu'un a écrit un wrapper Objective C autour de l'API, même si je ne l'ai pas essayé. Mais la vue d'set ne mentionne pas la partie concernant les events entourant les changements de files , juste les directorys (comme avec kqueue). J'ai fini par utiliser le code d' ici avec le file d'en-tête ici pour comstackr mon propre enregistreur que je pourrais utiliser pour get des events au niveau du file individuel. Vous devez écrire du code dans votre application pour exécuter l'enregistreur en arrière-plan et le surveiller.

Alternativement, jetez un oeil à la command " fs_usage ", qui surveille en permanence toute l'activité du système de files (et je veux dire tout ). Cela vient déjà avec Darwin, donc vous n'avez pas à le comstackr vous-même. Vous pouvez utiliser kqueue pour écouter les changements de directory, tout en surveillant la sortie de " fs_usage ". Si vous recevez une notification de la part de kqueue qu'un directory a changé, vous pouvez regarder la sortie de fs_usage, voir dans quels files ont été écrits, et vérifier les noms de files par rapport au directory qui a été modifié. fs_usage est un firehose, alors soyez prêt à utiliser certaines options avec Grep pour l'apprivoiser.

Pour rendre les choses plus amusantes, votre enregistreur FSEvents et fs_usage nécessitent un access root, vous devrez donc get l'autorisation de l'user avant de pouvoir les utiliser dans votre application OS X (consultez le Guide de programmation des services d'autorisation pour savoir comment fais le).

Si tout cela semble horriblement compliqué, c'est parce que c'est. Mais au less, vous n'aviez pas à le découvrir à la dure!