2011-10-11 3 views
7

J'essaie de trouver un moyen de surveiller le contenu d'un répertoire pour y apporter des modifications. J'ai essayé deux approches.Surveillance d'un répertoire dans Cocoa/Cocoa Touch

  1. Utilisez kqueue pour surveiller le répertoire
  2. Utilisez GCD pour surveiller le répertoire

Le problème que je rencontrais est que je ne peux pas trouver un moyen de détecter le fichier a changé. J'essaie de surveiller un répertoire contenant potentiellement des milliers de fichiers 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 fichier de ce répertoire. Est-ce actuellement possible?

Note: J'ai documenté les fichiers de suivi mes d'expériences avec kqueue et GCD

+0

Souhaitez-vous Mac OS X et iOS? –

+0

Je cible OS X mais cela m'intéresserait aussi si cela fonctionnait sur iOS. – DHamrick

Répondre

4

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

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

Votre première option consiste à utiliser l'infrastructure FSEvents, qui envoie des notifications lorsqu'un fichier est créé, modifié ou supprimé (ainsi que des choses à faire avec des attributs). L'aperçu est here, et quelqu'un a écrit un Objective C wrapper autour de l'API, bien que je ne l'ai pas essayé. Mais la vue d'ensemble ne mentionne pas la partie sur les événements entourant les changements fichier, juste des répertoires (comme avec kqueue). J'ai fini par utiliser le code de here avec le fichier d'en-tête here pour compiler mon propre enregistreur que je pourrais utiliser pour obtenir des événements au niveau du fichier individuel. Vous devez écrire du code dans votre application pour exécuter l'enregistreur en arrière-plan et le surveiller.

Sinon, regardez la commande "fs_usage", qui surveille en permanence toute l'activité du système de fichiers (et je veux dire all). Cela vient déjà avec Darwin, donc vous n'avez pas à le compiler vous-même. Vous pouvez utiliser kqueue pour écouter les changements de répertoire, tout en surveillant la sortie de "fs_usage". Si vous recevez une notification de la part de kqueue qu'un répertoire a changé, vous pouvez regarder la sortie de fs_usage, voir dans quels fichiers ont été écrits, et vérifier les noms de fichiers par rapport au répertoire 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 accès root, vous devrez donc obtenir l'autorisation de l'utilisateur avant de pouvoir les utiliser dans votre application OS X (consultez la section Authorization Services Programming Guide pour plus d'informations pour le faire).

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

+3

Est-ce que FSEvents est disponible sur iOS? Un programme iOS peut-il exécuter une commande arbitraire comme fs_usage? –

+0

Pour iOS, FSEvents ne serait pas vraiment nécessaire - puisque toutes les applications sont en sandbox, il n'y a pas d'événements de système de fichiers que vous ne vous causez pas en travaillant avec des fichiers dans le dossier Documents. J'ai vu des notes sur iOS5 indiquant que vous pourrez utiliser FSEvents sur le système de fichiers iCloud.Si vous parlez de téléphones * jailbreakés (murmures), il est possible que FSEvents soit envoyé, mais une recherche rapide sur Google n'a pas été concluante. Je doute qu'ils aient un outil comme fs_usage, mais vous pouvez en compiler un vous-même ... – sgress454