Qual è il modo migliore per ascoltare una cartella o un file per vedere se è stato salvato o se è stato aggiunto un nuovo file?Osservare un file o una cartella in Objective-C
risposta
L'API FSEvents è ideale se si desidera solo visualizzare le directory ma non gestire il monitoraggio dei singoli file. Stu Connolly ha un grande involucro Objective-C per l'API FSEvents C, si chiama SCEvents e si può ottenere qui:
http://stuconnolly.com/blog/scevents-011/
La cosa bella di FSEvents è che basta guardare una cartella e si verrà notificato di eventuali modifiche che si verificano in qualsiasi punto della gerarchia sottocartella di tale cartella.
Se sono necessarie notifiche a livello di file, è necessario utilizzare kqueues. Uli Kusterer ha un grande involucro Objective-C:
http://zathras.de/angelweb/sourcecode.htm#UKKQueue
Uno di questi metodi è molto più facile che dispute con le API C direttamente, che non sono particolarmente ben documentato e un po 'ottuso.
Se è necessario supportare Tiger, è necessario utilizzare kqueues poiché l'API FSEvents non era ufficialmente disponibile in 10.4.
Non è sicuro quale sia il modo migliore, ma un modo sarebbe quello di attivare un NSThread che regolarmente (ad esempio ogni secondo) controlla le date di creazione dei file nella directory e quindi dispone di un delegato associato a tale thread per eseguire una certa azione quando è stato aggiunto un nuovo file
Questo è il polling ed è scoraggiato. Utilizzare invece FSEvents o kqueues, che sono API progettate espressamente per questo scopo. –
La polarizzazione è scoraggiata, tuttavia è anche l'unica tecnica affidabile. Poling funzionerà * tutto * il tempo, anche su volumi di rete quando il file viene modificato da una macchina diversa. Ognuno dovrebbe almeno considerare di usarlo. –
"solo tecnica affidabile" cura di elaborare? Ascoltare eventi centrali sembra la scelta migliore. Batteria saggia. – eonist
Se si sta modificando un file o una cartella, credo che la Spotlight il motore di ricerca aggiornerà il suo database per riflettere le tue modifiche.
Quindi è possibile impostare un thread che ascolti le notifiche kMDQueryDidUpdateNotification tramite uno Spotlight query specifico per quel file o cartella.
Quando ricevi queste notifiche, puoi attivare un selettore che fa qualcosa che desideri.
Questa è una buona idea, ma il problema con Spotlight è che non tutti i volumi lo supportano (molti volumi di rete in particolare) e gli utenti hanno anche l'abitudine di spegnerlo. –
Questi sono buoni punti. Sto solo pensando ad alta voce. –
Inoltre potresti avere dei volumi in modalità privata sotto riflettori. Bello avere l'idea sul tavolo però. Pollice su! – eonist
Se hai bisogno di usare kqueue (come discusso in altre risposte) Google Toolbox per Mac ha un nice Objective-C wrapper che ho usato finora senza problemi.
KernelQueues wrapper in obj-c: https://gist.github.com/nielsbot/5155671 – eonist
Le cose sono cambiate da Mac OS 10.7 Lion.FSEvents ora supporta la granularità a livello di file, usa il flag kFSEventStreamCreateFlagFileEvents durante la creazione del flusso di eventi per essere informato sulle modifiche a determinati file. FSEvent Guide non riflette queste modifiche, ma [Riferimento] (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/FSEvents_Ref/Reference/reference.html#//apple_ref/c/econst/kFSEventStreamCreateFlagFileEvents) do. –
Che ne dici delle restrizioni sandbox? È possibile ricevere notifiche per qualsiasi percorso nel sistema? (Dopo che l'utente lo ha selezionato con l'apposita finestra di dialogo) – Vojto
Buona domanda. Credo che se hai selezionato una cartella usando un 'NSOpenPanel' (cioè il Powerbox), dovresti essere in grado di osservarlo per le modifiche senza problemi. –