web-dev-qa-db-fra.com

iOS: Comment trouvez-vous la date de création d'un fichier?

J'essaie de trouver la date de création (PAS la date de modification) d'un fichier.

La date de création ne semble pas être dans les attributs d'un fichier, bien que la date de modification soit.

J'utilise ce code ..

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;
}

Cela renvoie toujours zéro. La saisie de "po attrs" dans le débogueur pour obtenir la liste des paires clé/valeur dans NSDictionary renvoie ce qui suit.

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;

Aucune date de création .. bah ..

Quelqu'un connaît-il un autre moyen d'obtenir la date de création ou n'existe-t-il tout simplement pas dans iOS?

35
Ben Clayton

Ce code me renvoie en fait la bonne date de création:

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");
}

Créez-vous le fichier dans l'application? C'est peut-être là que réside le problème.

68
Oriol Nieto

Il y a un message spécial fileCreationDate pour cela dans NSDictionary. Ce qui suit fonctionne pour moi:

Objectif-C:

NSDate *date = [attrs fileCreationDate];

Swift:

let attrs = try NSFileManager.defaultManager().attributesOfItemAtPath(path) as NSDictionary
attrs.fileCreationDate()
18
Ridcully

Version Swift 2.0:

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)
}
8
Sam

Dans Swift 4, si vous voulez connaître la date de création du fichier pour un fichier spécifique dans DocumentsDirectory, vous pouvez utiliser cette méthode

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
    }
7
Naishta
  NSDate *creationDate = nil;
  if ([fileManager fileExistsAtPath:filePath]) {
       NSDictionary *attributes = [fileManager attributesOfItemAtPath:filePath error:nil];
       creationDate = attributes[NSFileCreationDate];
  }

C'est ici

3
Govind

Réponse mise à jour pour Swift 4 pour retirer la modification (.modifiedDate) ou la création (.creationDate) Date:

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. En utilisant un fichier que vous fournissez à l'avance via une URL, il demandera ses attributs. En cas de succès, un dictionnaire de [FileAttributeKey: Any] est renvoyé
  2. En utilisant le dictionnaire de l'étape 1, il extrait ensuite la date de création (ou modifiée si vous préférez) et en utilisant le déballage conditionnel, l'affecte à une date en cas de succès
  3. En supposant que les deux premières étapes ont réussi, vous avez maintenant une date avec laquelle vous pouvez travailler
3
CodeBender

Code de version Swift 3:

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)")
    }
2
mriaz0011

Peux tu utiliser fstat64 pour obtenir le st_birthtimespec membre de la structure retournée? Vous devrez créer un descripteur de fichier C pour le fichier et convertir la valeur timespec en NSDate, mais c'est mieux que rien.

1
Jeff Kelley

Dans Swift 5:

let date = (try? FileManager.default.attributesOfItem(atPath: path))?[.creationDate] as? Date
1
mishimay