2013-06-03 13 views
5

Desidero visualizzare la data "Ultima apertura" nella mia app proprio come nell'anteprima del Finder o nel pannello delle informazioni. Comunque mi sono reso conto che questo non è lo stesso che l'ultima data di accesso che vorrei avere conCome ottenere la data dell'ultima apertura come visualizzata nel Finder

NSDate* lastAccessDate = [fileUrl resourceValuesForKeys:@[NSURLContentAccessDateKey] error:NULL][NSURLContentAccessDateKey]; 

o con

struct stat buf; 
stat(curName, &buf); 
time_t lastAccessDate = buf.st_atimespec.tv_sec; 

Queste restituiscono l'ultimo tempo di accesso Unix che viene visualizzato anche in Terminal per ls -l Tuttavia Finder visualizza un valore differente che cambia solo quando il file viene aperto dall'utente (ad esempio tramite un doppio clic)


Ho letto i messaggi 'Get the real “last opened” date?' e '“Last Opened” Date' ma questi non l'hanno risolto. Essi raccomandano qualcosa come

MDItemRef itemRef = MDItemCreateWithURL(NULL, (__bridge CFURLRef)fileUrl); 
NSArray *attributeNames = (__bridge NSArray *)MDItemCopyAttributeNames(itemRef); 
NSDictionary *attributes = (__bridge NSDictionary *) MDItemCopyAttributes(itemRef, (__bridge CFArrayRef) attributeNames); 
CFDateRef lastUsedCfDate = MDItemCopyAttribute(itemRef, kMDItemLastUsedDate); 
NSDate* lastUsedDate = (__bridge NSDate*) lastUsedCfDate; 
CFRelease(itemRef); 

Ma attributeNames non ha un valore kMDItemLastUsedDate. Nel mio caso ci sono esattamente 24 valori in quell'array, ma nessuno per l'ultimo utilizzo. Quindi lastUsedDate è nil ...

Inoltre, mi chiedo se non ci sia davvero un'API di alto livello per accedere all'ultima data aperta.

+0

'mdls' (sul terminale) mostra una voce per' kMDItemLastUsedDate'? Inoltre, nota che stai perdendo 'attributes' e' lastUsedCfDate'. –

+0

Ah, ho giocato un po 'con 'mdls' e ho capito che' kMDItemLastUsedDate' non è impostato per i file che sono stati copiati ma non ancora aperti. Tuttavia, il Finder mostra anche l'ultima volta aperta per questi file. Posso impostare manualmente 'kMDItemLastUsedDate'? Chiedo, perché voglio copiare i file e impostare tutti gli attributi sui valori del file sorgente. – codingFriend1

+0

Non sono sicuro che sia possibile impostare gli attributi Spotlight come è possibile con 'xattr' (sia l'utilità della riga di comando che l'API) a meno che non si scriva un importatore Spotlight. Come stai copiando il file? Hai provato 'copyfile (3)'? 'cp -p' copia alcuni attributi ma non' kMDItemLastUsedDate'. –

risposta

0

http://forums.macrumors.com/showthread.php?t=855913

Per citare chown33:

attributi estesi sono completamente diversi dai metadati. Xattrs è collegato al file, memorizzato come parte del file system. I metadati vengono estratti dal file, memorizzati nell'archivio dei metadati (essenzialmente, il database di Spotlight). Alcuni xattr vengono estratti e archiviati nell'archivio dei metadati, ma sono ancora due cose separate.

I comandi che operano sui metadati in forma il 'MD *' globbing modello: mdfind, mdls, mdutil, ecc

...

In genere non si ottiene di aggiornare qualsiasi dei metadati valori. Questo è in base alla progettazione, da ciò che vedo guardando l'API di basso livello.

+0

Mi dispiace, ma questo non risponde alla domanda. So che posso ottenere i metadati del riflettore usando i comandi md *.Ma ho bisogno di farlo dal codice Cocoa e preferirei non creare attività a riga di comando e fare un parsing di output della console ... – codingFriend1

+0

@ codingFriend1, stavo proiettando le mie intenzioni su di te. Stavo cercando di modificare i metadati, ma da quello che ho trovato penso che la risposta a questo è che il sistema di metadati è stato progettato per impedirlo. Dopo aver riletto la tua domanda, vedo che stai solo cercando di leggere i metadati. – pw222

0

Mi sono imbattuto nello stesso problema. Ho scoperto che quando Finder rileva un caso in cui la chiave kMDItemLastUsedDate non è disponibile, verrà invece visualizzato il valore per la chiave kMDItemFSContentChangeDate.

Problemi correlati