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ć!
Czy kierujesz reklamy zarówno na Mac OS X, jak i iOS? –
Celuję w OS X, ale byłem też zainteresowany, czy zadziała w systemie iOS. – DHamrick