C'è una soluzione: GCD. GCD ti consente di creare un dispatch_source_t
Che osserva le modifiche a VNode, come una scrittura in una directory, quindi ti avvisa. Il base è: usa il open(path, O_EVTONLY)
syscall per ottenere un descrittore di file alla directory, quindi chiama dispatch_source_create()
e passare DISPATCH_SOURCE_TYPE_VNODE
come tipo e DISPATCH_VNODE_WRITE
come maschera. Imposta il gestore di eventi utilizzando dispatch_source_set_event_handler
E fai tutto ciò che devi fare quando un file è scritto nella directory, inoltre si desidera anche impostare un gestore di cancellazione che chiama close()
Per chiudere il descrittore di file. Infine, chiama dispatch_resume()
per iniziare il monitoraggio.
Rileva la modifica del file nella directory dei documenti
-
29-07-2022 - |
Domanda
La mia app ha la condivisione dei file iTunes accesi e quando l'utente aggiunge un file in iTunes, dovrebbe essere in grado di rilevare.
La seguente funzione del delegato dell'applicazione viene utilizzata per essere chiamata ma non più:
- (void)applicationDidBecomeActive:(UIApplication *)application
Esiste una soluzione alternativa?
Soluzione
Altri suggerimenti
È possibile archiviare un hash MD5 dall'ultimo file con cui l'app stava lavorando. Ogni volta che inizi la tua app, calcola un nuovo hash dal file che stai monitorando. Se l'hash è diverso da quello che hai archiviato prima, il file è stato modificato:
Ecco una soluzione per il calcolo degli hash del file MD5:Calcolo del file hash MD5
La domanda è ancora valida se invece di rilevare quando i file vengono aggiunti o rimossi da una cartella che si desidera sapere se qualunque Il file nella cartella monitorata è stato modificato. Non ho avuto alcun successo nel far funzionare questo con dispatch_vnode_write.
Sì, è vero che ricevo un evento Dispatch_vnode_write quando un file viene aggiunto, eliminato o rinominato nella cartella (anche se qui c'è un problema - per scoprire quale di questi 3 è successo dovrai prendere le istantanee del contenuto della cartella E confrontali - Yuck!). Ma se un file esistente dalla cartella viene modificato, non ottengo qualunque notifica. Ho provato anche Dispatch_Vnode_Extend e Dispatch_VNode_ATTRIB senza alcun successo. Questo fa schifo perché se hai una directory con centinaia o migliaia di file, come si suppone di scoprire se un file cambia?
Il carbonio deprecato Fsevents La libreria era più flessibile e potente dell'approccio della sorgente di spedizione GCD + IMO.