2009-09-06 7 views

risposta

32

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.

+5

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. –

+0

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

+0

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. –

-3

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

+11

Questo è il polling ed è scoraggiato. Utilizzare invece FSEvents o kqueues, che sono API progettate espressamente per questo scopo. –

+2

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. –

+0

"solo tecnica affidabile" cura di elaborare? Ascoltare eventi centrali sembra la scelta migliore. Batteria saggia. – eonist

6

Prova utilizzando FSEvents, anche se si tratta di un'API C

OS 10.5 o più recente

+0

Attualmente molte librerie wrapper FSEvent su github. Anche per Swift – eonist

1

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.

+2

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. –

+0

Questi sono buoni punti. Sto solo pensando ad alta voce. –

+0

Inoltre potresti avere dei volumi in modalità privata sotto riflettori. Bello avere l'idea sul tavolo però. Pollice su! – eonist

1

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.

+0

KernelQueues wrapper in obj-c: https://gist.github.com/nielsbot/5155671 – eonist

Problemi correlati