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
- 1. Accesso a un file o una cartella sul server heroku
- 2. Cerca file in una cartella
- 3. Implementare protocollo ObjectiveC in rapida
- 4. Come posso aggiungere una cartella o un file alla radice in una ricetta con bitbake?
- 5. ObjectiveC blocca l'equivalente Java
- 6. codice Visual Studio non riapre file o una cartella
- 7. Come dividere newline da NSString in ObjectiveC
- 8. Come creare un file in java (non in una cartella)?
- 9. sposta tutti i file in una cartella in un altro?
- 10. PhoneGap: Creare un file in una cartella specifica
- 11. Osservare la pigrizia in Haskell
- 12. Trova tutti i file in una cartella
- 13. Rinominare alcuni file in una cartella
- 14. Looping di file in una cartella
- 15. Apri tutti i file in una cartella
- 16. Posso inserire un ObjectiveC @selector in un NSDictionary?
- 17. Come verificare se un file esiste in una cartella?
- 18. DotLess - Come importare un file LESS in una cartella principale?
- 19. Come aggiungere una cartella in un file nuspec
- 20. È possibile osservare -visibleRect
- 21. Conteggio file da una cartella
- 22. Osservare un'espressione dall'interno di una direttiva
- 23. Osservare ProprietàChanged su elementi di una raccolta
- 24. Creare una cartella esistente in un repository
- 25. Esegui un file o una mappa in phpunit
- 26. Osservare globali non globali
- 27. Come spostare/copiare un file da una cartella ad un'altra cartella in Android usando phonegap?
- 28. Elimina file o cartella in modo ricorsivo su windows cmd
- 29. Posso osservare quando un UIViewController cambia interfacciaOrientation?
- 30. Come posso cancellare una cartella o un file con percorso troppo lungo nel cestino?
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. –