2011-10-11 15 views
7

Próbuję znaleźć sposób na monitorowanie zawartości katalogu zmian. Próbowałem dwóch podejść.Monitorowanie katalogu w kakao/kakao Touch

  1. Zastosowanie KQUEUE monitorować the directory
  2. Używaj GCD monitorować the directory

Problem mam napotykając jest to, że nie mogę znaleźć sposób, aby wykryć, który plik został zmieniony. Próbuję monitorować katalog z potencjalnie tysiącami plików i nie chcę wywoływać statystyk na każdym z nich, aby dowiedzieć się, które z nich uległy zmianie. Nie chcę też konfigurować oddzielnego źródła wysyłki dla każdego pliku w tym katalogu. Czy to jest obecnie możliwe?

Uwaga: mam udokumentować moje eksperymenty z kqueue plików monitorowania i GCD

+0

Czy kierujesz reklamy zarówno na Mac OS X, jak i iOS? –

+0

Celuję w OS X, ale byłem też zainteresowany, czy zadziała w systemie iOS. – DHamrick

Odpowiedz

4

Moja rada jest po prostu zacisnąć zęby i wykonać skanowanie katalogów w innym wątku, nawet jeśli mówimy o tysiącach plików. Ale jeśli nalegasz, oto odpowiedź:

Nie ma sposobu, aby to zrobić bez zwijania rękawów i nurkowania w kernelu.

Twoja pierwsza opcja polega na użyciu frameworku FSEvents, który wysyła powiadomienia, gdy plik jest tworzony, edytowany lub usuwany (jak również rzeczy związane z atrybutami). Przegląd to here, a ktoś napisał Objective C wrapper wokół API, chociaż go nie wypróbowałem. Ale przegląd nie wspomina części o zdarzeniach związanych z zmianami, po prostu katalogów (jak z kqueue). Skończyło się na tym, że użyłem kodu z here wraz z plikiem nagłówkowym here, aby skompilować mój własny program rejestrujący, który mógłbym wykorzystać do uzyskania zdarzeń na poziomie pojedynczego pliku. Musisz napisać kod w swojej aplikacji, aby uruchomić rejestrator w tle i monitorować go.

Możesz również skorzystać z polecenia "fs_usage", które stale monitoruje całą aktywność systemu plików (i mam na myśli wszystkie). To już jest z Darwinem, więc nie musisz sam go kompilować. Możesz użyć kqueue do odsłuchiwania zmian w katalogu, jednocześnie monitorując dane wyjściowe z "fs_usage". Jeśli otrzymasz powiadomienie od kqueue, że katalog się zmienił, możesz spojrzeć na dane wyjściowe z fs_usage, zobaczyć, do których plików zostały zapisane i sprawdzić nazwy plików względem katalogu, który został zmodyfikowany. fs_usage jest firehose, więc bądź gotów użyć niektórych opcji wraz z Grepem, aby go poskromić.

Aby sprawić więcej radości, zarówno program rejestrujący FSEvents, jak i fs_usage, wymagają uprawnień administratora, więc musisz uzyskać autoryzację od użytkownika, zanim będziesz mógł z nich korzystać w aplikacji OS X (sprawdź numer Authorization Services Programming Guide, aby dowiedzieć się, jak aby to zrobić).

Jeśli to wszystko brzmi okropnie skomplikowane, to dlatego, że tak. Ale przynajmniej nie musiałeś się przekonywać!

+3

Czy FSEvent jest dostępny na iOS? Czy program iOS może uruchamiać dowolne polecenie, takie jak fs_usage? –

+0

W przypadku iOS programy FSEvent nie będą potrzebne - ponieważ wszystkie aplikacje są piaskowane, nie ma żadnych zdarzeń związanych z systemem plików, które nie wywoływałyby skutków pracy z plikami w folderze Dokumenty. Widziałem notatki na temat iOS5, które wskazują, że będziesz mógł używać FSEvents w systemie plików iCloud.Jeśli mówisz o * telefonach z jailbreakem * (szeptem), to możliwe, że wysyłane są wiadomości FSEvent, ale szybkie wyszukiwanie w Google było nierozstrzygające. Wątpię, czy masz wbudowane narzędzie takie jak fs_usage, ale sam możesz je skompilować ... – sgress454