Jaki jest najlepszy sposób na odsłuchanie folderu lub pliku, aby sprawdzić, czy został on zapisany lub czy został dodany nowy plik?Obserwuj plik lub folder w celu C
Odpowiedz
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.
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
To jest głosowanie i jest odradzane. Zamiast tego używaj FSEvents lub kingsów, które są specjalnie zaprojektowane do tego celu. –
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. –
"tylko niezawodna technika" do opracowania? Słuchanie centralnych wydarzeń wydaje się lepszym wyborem. Bateria mądra. – eonist
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.
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. –
To są dobre punkty. Po prostu głośno myślę. –
Również możesz mieć woluminy w trybie prywatnym w świetle reflektorów. Miło mieć pomysł na stole. Kciuki w górę! – eonist
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.
Otoczka KernelQueues w obj-c: https://gist.github.com/nielsbot/5155671 – eonist
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). –
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
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. –