2010-01-21 9 views
26

Ich versuche das Erstellungsdatum (NICHT Änderungsdatum) einer Datei zu finden.iOS: Wie finden Sie das Erstellungsdatum einer Datei?

Das Erstellungsdatum scheint nicht in den Attributen einer Datei zu sein, obwohl das Änderungsdatum ist.

ich diesen Code bin mit ..

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

Dies liefert immer gleich Null. Die Eingabe von "po attrs" in den Debugger, um die Liste der Schlüssel/Wert-Paare im NSDictionary zu erhalten, ergibt folgendes:

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

Keine Erstellungsdatum .. bah ..

Wer weiß, eine andere Art und Weise das Erstellungsdatum des Erhaltens oder gibt es sie einfach nicht in iOS?

+0

beachten können Beachten Sie, dass die Spur, die ich gezeigt habe, ist aus dem iPhone-Simulator. Ich bekomme das gleiche Problem auf einem echten Gerät aber - Erstellungsdatum ist nicht aufgeführt. –

+1

Die Dokumentation listet NSFileCreationDate als zurückgegebenen Wert auf, damit Sie möglicherweise einen Fehler bei Apple einreichen können. Es klingt sicherlich so, als würde sich das nicht wie erwartet verhalten. –

Antwort

61

Dieser Code gibt tatsächlich das gute Erstellungsdatum zu mir:

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

Sind Sie die Datei innerhalb der App zu erstellen? Vielleicht ist das das Problem.

+0

Das funktioniert gut für mich, ist Jeff Kelley's Antwort immer noch gültig? – bentford

+0

Tut mir leid, diese dumme Frage zu stellen ... "attributesOfItemAtPath: path" Wie initialisiert man diese "path" Variable? Angenommen, ich habe ein Bild namens "icon_57.png" im Projektstamm abgelegt? –

+1

@ jeet.chanchawat hier ist eine Swift-Implementierung ... sollte einfach genug sein, um die Syntax für ObjC 'zu erhalten documentsDirectoryString = NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true) [0] zurückgeben documentsDirectory.stringByAppendingPathComponent (" icon_57.png ") ' – Magoo

1

Können Sie fstat64 verwenden, um das st_birthtimespec Mitglied der zurückgegebenen Struktur zu erhalten? Sie müssen ein C-Dateihandle für die Datei erstellen und den Wert timespec in einen NSDate konvertieren, aber das ist besser als nichts.

+1

Nein, Sie sollten fstat64 nicht benutzen können, da das iPhone nach bestem Wissen noch keine 64 Bit enthält. Leider ist die Struktur-Zeitangabe st_birthtimespec im 32-Bit-Modus NICHT in struct stat verfügbar. Dies ist der Grund, warum das NSDate-Objekt, das von [attrs fileCreationDate] zurückgegeben wird, immer gleich Null auf dem iPhone ist, wie in 3.1.2, wo attrs das NSDictionary ist, das die Dateiattribute enthält. –

+0

Danke Jungs. Anscheinend muss ich mich daran erinnern, wann die Datei erstellt und in NSUserDefaults gespeichert wurde. –

+0

Warum können wir den Code urinieto nicht verwenden? – bentford

15

Es gibt eine spezielle Nachricht fileCreationDate dafür in NSDictionary. Die folgenden Werke für mich:

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

Seine here

7

Swift 2.0 Version:

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 3 Versionscode:

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

Schätzen Sie, wenn Sie Ihre Antwort auch erklären könnten. –

+0

Verwenden Sie FileAttributeKey.creationDate, wenn das Erstellungsdatum der Datei dem OP entsprechen soll. – biomiker

2

In Swift 4, wenn Sie die Datei erstellt Datum für eine bestimmte Datei in documents wissen möchten, können Sie diese Methode verwenden

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

aktualisiert Antwort für Swift 4 die modifizierte (.modifiedDate) oder Schöpfung ziehen (.creationDate) Datum:

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. eine Datei, die Sie über eine URL im Voraus zur Verfügung stellen, wird es seine Attribute anfordern. Wenn erfolgreich ein Wörterbuch von [FileAttributeKey: Any] zurückgegeben wird
  2. Mit dem Wörterbuch aus Schritt 1, es zieht dann das Erstellungsdatum (oder geändert, wenn Sie bevorzugen) und die bedingte unwrap, weist es auf ein Datum, wenn erfolgreich
  3. Vorausgesetzt, die ersten beiden Schritte sind erfolgreich, Sie haben jetzt ein Datum, das Sie mit
Verwandte Themen