2009-09-06 14 views

Odpowiedz

32

Interfejs API programu FSEvents jest idealny, jeśli po prostu chcesz oglądać katalogi, ale nie obsługuje on monitorowania pojedynczych plików. Stu Connolly ma wielką Objective-C otoki dla FSEvents C API, który nazywa SCEvents i można go pobrać tutaj:

http://stuconnolly.com/blog/scevents-011/

Zaletą FSEvents jest to, że po prostu trzeba obejrzeć jeden folder i ty zostanie powiadomiony o wszelkich zmianach, które wystąpią w dowolnym miejscu w hierarchii podfolderów tego folderu.

Jeśli potrzebujesz powiadomień na poziomie pliku, będziesz musiał użyć kqueues. Uli Kusterer ma wielką celu C opakowanie:

http://zathras.de/angelweb/sourcecode.htm#UKKQueue

Każda z tych metod nie jest o wiele łatwiejsze niż spory zc API bezpośrednio, które nie są zbyt dobrze udokumentowane i nieco rozwarty.

Jeśli potrzebujesz wsparcia dla Tigera, musisz użyć kqueues, ponieważ interfejs API FSEvents nie był oficjalnie dostępny w wersji 10.4.

+5

Rzeczy się zmieniły od czasu Mac OS 10.7 Lion.Program FSEvents obsługuje teraz szczegółowość na poziomie plików, podczas tworzenia strumienia zdarzeń można użyć flagi kFSEventStreamCreateFlagFileEvents, aby uzyskać informacje o zmianach w poszczególnych plikach. Przewodnik FSEvent nie odzwierciedla tych zmian, ale [Odnośnik] (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/FSEvents_Ref/Reference/reference.html#//apple_ref/c/econst/kFSEventStreamCreateFlagFileEvents). –

+0

Co powiesz na ograniczenia piaskownicy? Czy można otrzymywać powiadomienia o dowolnej ścieżce w systemie? (Po wybraniu przez użytkownika w specjalnym oknie dialogowym) – Vojto

+0

Dobre pytanie. Wierzę, że jeśli wybrałeś folder za pomocą 'NSOpenPanel' (tj. Powerbox), powinieneś być w stanie obserwować go dla zmian bez żadnych problemów. –

-3

Nie wiem, jaki jest najlepszy sposób, ale sposobem na wyzwolenie NSThread, który regularnie (na przykład co drugi) sprawdzałby daty utworzenia plików w katalogu, a następnie miał delegata powiązanego z tym wątkiem aby wykonać pewne działania, gdy nowy plik został dodany

+11

To jest głosowanie i jest odradzane. Zamiast tego używaj FSEvents lub kingsów, które są specjalnie zaprojektowane do tego celu. –

+2

Poling jest odradzany, ale jest to również jedyna niezawodna technika. Poling będzie działał * cały * czas, nawet ponad woluminami sieciowymi, gdy plik jest modyfikowany przez inne urządzenie. Każdy powinien przynajmniej rozważyć skorzystanie z niego. –

+0

"tylko niezawodna technika" do opracowania? Słuchanie centralnych wydarzeń wydaje się lepszym wyborem. Bateria mądra. – eonist

6

Spróbuj użyć FSEvents, chociaż jest to C API

OS 10.5 lub nowszy

+0

Wiele bibliotek otoki FSEvent na github te dni. Nawet dla Swift – eonist

1

Jeśli zmieniasz plik lub folder, wierzę Spotlight wyszukiwarka zaktualizuje swoją bazę danych, aby odzwierciedlić zmiany.

Możesz skonfigurować wątek, który będzie monitorował powiadomienia o numerach kMDQueryDidUpdateNotification przez specyfikację Spotlight query dla tego pliku lub folderu.

Po otrzymaniu tych powiadomień można zwolnić selektor, który robi co tylko chce.

+2

To jest dobry pomysł, ale problem ze Spotlight polega na tym, że nie wszystkie woluminy go obsługują (w szczególności wiele woluminów sieciowych), a użytkownicy mają zwyczaj wyłączania go. –

+0

To są dobre punkty. Po prostu głośno myślę. –

+0

Również możesz mieć woluminy w trybie prywatnym w świetle reflektorów. Miło mieć pomysł na stole. Kciuki w górę! – eonist

1

Jeśli potrzebujesz użyć kqueue (jak omówiono w innych odpowiedziach), Google Toolbox dla Maca ma nice Objective-C wrapper, z którego korzystałem dotychczas bez żadnych problemów.

+0

Otoczka KernelQueues w obj-c: https://gist.github.com/nielsbot/5155671 – eonist