iOS: Comment trouvez-vous la date de création d'un fichier?
-
22-09-2019 - |
Question
Je suis en train de trouver la date de création (pas de date de modification) d'un fichier.
Date de création ne semble pas être dans les attributs d'un fichier, bien que la date de modification est.
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;
}
retourne toujours nul. Taper « po » attrs dans le débogueur pour obtenir la liste des paires clé / valeur dans le NSDictionary renvoie les éléments suivants ..
NSFileGroupOwnerAccountID = 20;
NSFileGroupOwnerAccountName = personnel;
NSFileModificationDate = 2010-01-21 11:47:55 +0000;
NSFileOwnerAccountID = 501;
NSFileOwnerAccountName = ben;
NSFilePosixPermissions = 420;
NSFileReferenceCount = 1;
NSFileSize = 338;
NSFileSystemFileNumber = 2234;
NSFileSystemNumber = 42553324;
NSFileType = NSFileTypeRegular;
Pas de date de création .. .. bah
Quelqu'un sait une autre façon d'obtenir la date de création ou est-il tout simplement pas exister dans iOS?
La solution
Ce code renvoie en fait la bonne date de création pour moi:
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");
}
Vous créez le fichier dans l'App? Peut-être est là le problème.
Autres conseils
Il y a un message spécial fileCreationDate
pour que NSDictionary
. Les travaux suivants pour moi:
Objective-C:
NSDate *date = [attrs fileCreationDate];
Swift:
let attrs = try NSFileManager.defaultManager().attributesOfItemAtPath(path) as NSDictionary
attrs.fileCreationDate()
Version 2.0 Swift:
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)
}
Dans Swift 4, si vous voulez connaître le fichier date de création d'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
}
Swift 3 Code version:
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)")
}
réponse Mise à jour Swift 4 pour retirer la date de modification (.modifiedDate
) ou la création (.creationDate
):
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)
}
- L'utilisation d'un fichier que vous fournissez à l'avance via une URL, il demandera ses attributs. En cas de succès un dictionnaire de [FileAttributeKey: Tout] est retourné
- Utiliser le dictionnaire de l'étape 1, il tire ensuite la date de création (ou Modified si vous préférez) et en utilisant le Déballer conditionnel, il cède à une date en cas de succès
- En supposant que les deux premières étapes avec succès, vous avez maintenant une date que vous pouvez travailler avec
Pouvez-vous utiliser fstat64
pour obtenir le membre de st_birthtimespec
du retour struct? Vous devrez créer un descripteur de fichier C pour le fichier et convertir la valeur timespec
dans un NSDate
, mais qui est mieux que rien.