2010-01-21 4 views
26

Sto cercando di trovare la data di creazione (NON la data di modifica) di un file.iOS: come si trova la data di creazione di un file?

La data di creazione non sembra essere negli attributi di un file, anche se la data di modifica è.

sto usando questo codice ..

NSFileManager* fm = [NSFileManager defaultManager]; 

NSString* path = [PathHelpers pathInDocumentsFolderWithFilename:FILE_NAME]; 
NSDictionary* attrs = [fm attributesOfItemAtPath:path error:nil]; 

if (attrs != nil) { 
    return (NSDate*)[attrs objectForKey: NSFileCreationDate]; 
} else { 
    return nil; 
} 

restituisce questo sempre pari a zero. Digitando 'po attrs' nel debugger per ottenere l'elenco di coppie chiave/valore nel NSDictionary restituisce quanto segue.

NSFileGroupOwnerAccountID = 20;
NSFileGroupOwnerAccountName = staff;
NSFileModificationDate = 2010-01-21 11:47:55 +0000;
NSFileOwnerAccountID = 501;
NSFileOwnerAccountName = ben;
NSFilePosixPermissions = 420;
NSFileReferenceCount = 1;
NSFileSize = 338;
NSFileSystemFileNumber = 2234;
NSFileSystemNumber = 42553324;
NSFileType = NSFileTypeRegular;

Nessuna data di creazione .. bah ..

Qualcuno sa altro modo di ottenere la data di creazione o lo fa semplicemente non esiste in iOS?

+0

Nota che la traccia che ho indicato è dal simulatore iPhone. Ho lo stesso problema su un dispositivo reale tuttavia - la data di creazione non è elencata. –

+1

La documentazione elenca NSFileCreationDate come valore restituito, oppure potresti voler segnalare un bug con Apple. Sembra certamente che questo non si comporti come previsto. –

risposta

61

Questo codice in realtà restituisce la data di creazione buona di me:

NSFileManager* fm = [NSFileManager defaultManager]; 
NSDictionary* attrs = [fm attributesOfItemAtPath:path error:nil]; 

if (attrs != nil) { 
    NSDate *date = (NSDate*)[attrs objectForKey: NSFileCreationDate]; 
    NSLog(@"Date Created: %@", [date description]); 
} 
else { 
    NSLog(@"Not found"); 
} 

Si sta creando il file all'interno della app? Forse è qui che il problema è.

+0

Questo lavoro va bene per me, la risposta di Jeff Kelley è ancora valida? – bentford

+0

Mi dispiace chiedere questa stupida domanda ... "attributesOfItemAtPath: path" Come inizializzare questa variabile "percorso". supponiamo di avere un'immagine denominata "icon_57.png" inserita nella radice del progetto? –

+1

@ jeet.chanchawat ecco un'implementazione Swift ... dovrebbe essere abbastanza facile da ottenere la sintassi per objC 'lasciare documentsDirectoryString = NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true) [0] ritorno documentsDirectory.stringByAppendingPathComponent ("icon_57.png") ' – Magoo

1

È possibile utilizzare fstat64 per ottenere il membro st_birthtimespec della struttura restituita? Dovrai creare un handle di file C per il file e convertire il valore timespec in un NSDate, ma è meglio di niente.

+1

No, non dovresti essere in grado di utilizzare fstat64 a causa del fatto che, per quanto sappia, il sistema operativo per iPhone non è ancora a 64 bit. Sfortunatamente, in modalità 32 bit, la struct timespec st_birthtimespec NON è disponibile in struct stat. Questo è il motivo per cui l'oggetto NSDate restituito da [attrs fileCreationDate] sarà sempre nullo su iPhone a partire dalla 3.1.2, dove attrs è il NSDictionary che contiene gli attributi del file. –

+0

Grazie ragazzi. Sembra che dovrò ricordare quando il file è stato creato e memorizzarlo in NSUserDefaults. –

+0

Perché non possiamo usare il codice urinieto pubblicato? – bentford

15

C'è un messaggio speciale fileCreationDate per quello in NSDictionary. Le seguenti opere per me:

Objective-C:

NSDate *date = [attrs fileCreationDate]; 

Swift:

let attrs = try NSFileManager.defaultManager().attributesOfItemAtPath(path) as NSDictionary 
attrs.fileCreationDate() 
3
NSDate *creationDate = nil; 
    if ([fileManager fileExistsAtPath:filePath]) { 
     NSDictionary *attributes = [fileManager attributesOfItemAtPath:filePath error:nil]; 
     creationDate = attributes[NSFileCreationDate]; 
    } 

sua here

7

Swift 2.0 Versione:

do { 
    let fileAttributes = try NSFileManager.defaultManager().attributesOfItemAtPath(YOURPATH) 
    let creationDate = fileAttributes[NSFileCreationDate] as? NSDate 
    let modificationDate = fileAttributes[NSFileModificationDate] as? NSDate 
    print("creation date of file is", creationDate) 
    print("modification date of file is", modificationDate) 
}catch let error as NSError { 
    print("file not found:", error) 
} 
1

Swift codice 3 Versione:

do { 
     let fileAttributes = try FileManager.default.attributesOfItem(atPath: yourPathString) 
     let modificationDate = fileAttributes[FileAttributeKey.modificationDate] as! Date 
     print("Modification date: ", modificationDate) 
    } catch let error { 
     print("Error getting file modification attribute date: \(error.localizedDescription)") 
    } 
+0

Apprezzo se anche tu potresti spiegare la tua risposta. –

+0

Utilizzare FileAttributeKey.creationDate se si desidera la data di creazione del file secondo l'OP. – biomiker

2

a Swift 4, se si desidera conoscere il file data di creazione di un file specifico in documentsDirectory, è possibile utilizzare questo metodo

func getfileCreatedDate(theFile: String) -> Date { 

     var theCreationDate = Date() 
     do{ 
      let aFileAttributes = try FileManager.default.attributesOfItem(atPath: theFile) as [FileAttributeKey:Any] 
      theCreationDate = aFileAttributes[FileAttributeKey.creationDate] as! Date 

     } catch let theError as Error{ 
      print("file not found \(theError)") 
     } 
     return theCreationDate 
    } 
0

risposta aggiornata per Swift 4 per tirare fuori il (.creationDate) data di modifica (.modifiedDate) o la creazione:

let file: URL = ... 
if let attributes = try? FileManager.default.attributesOfItem(atPath: file.path) as [FileAttributeKey: Any], 
    let creationDate = attributes[FileAttributeKey.creationDate] as? Date { 
    print(creationDate) 
    } 
  1. utilizzo di un file che si forniscono in anticipo tramite un URL, richiederà i suoi attributi. In caso di esito positivo viene restituito un dizionario di [FileAttributeKey: Any]
  2. Utilizzando il dizionario del passaggio 1, quindi estrae la data di creazione (o modificata se si preferisce) e utilizzando lo scomposizione condizionale, lo assegna ad una data in caso di esito positivo
  3. Supponendo che i primi due passi sono di successo, ora avete una data che si può lavorare con