Android: Wie erhalte ich das Erstellungsdatum einer Datei?

74

Das ist mein Code:

File TempFiles = new File(Tempfilepath);
if (TempFiles.exists()) {
    String[] child = TempFiles.list();
    for (int i = 0; i < child.length; i++) {
        Log.i("File: " + child[i] + " creation date ?");
        // how to get file creation date..?
    }
}
Jorgesys
quelle
6
Wenn Sie Zeit erstellen möchten, warum haben Sie die geänderte Zeit akzeptiert? stackoverflow.com/questions/2723838/…
M am

Antworten:

190

Das Erstellungsdatum der Datei ist nicht verfügbar , Sie können jedoch das Datum der letzten Änderung abrufen :

File file = new File(filePath);
Date lastModDate = new Date(file.lastModified());

System.out.println("File last modified @ : "+ lastModDate.toString());
Jorgesys
quelle
1
Verwenden Sie den zuletzt geänderten HTTP-Header.
AhmetB - Google
5
Wie @CommonsWare unten ausführt, ist die lastModified-Zeit nicht die Erstellungszeit. Die Erstellungszeit ist nicht verfügbar.
Miguel
1
Bitte lesen Sie zuerst, die Verwendung der zuletzt geänderten Option ist eine Option, da die Erstellungszeit nicht verfügbar ist.
Jorgesys
2
Eine Information, die ich vermisse, ist eine klare Angabe, ob File.lastModified Ortszeit oder UTC ist. Der Konsens ist, dass es sich um UTC stackoverflow.com/questions/5264339/… handelt, und das würde ich auch von einem semimodernen System erwarten. Aber warum geben die Spezifikationen von Oracle developer.android.com/reference/java/io/… dies nicht eindeutig an? "... gemessen in Millisekunden seit dem 1. Januar 1970, Mitternacht." kann, wenn man ausreichend paranoid ist, entweder als UTC 1. Januar 1970, Mitternacht oder lokal 1. Januar 1970, Mitternacht interpretiert werden.
RenniePet
2
Es wird seit dem 1. Januar 1970, UTC, in Millisekunden gespeichert, aber darüber müssen Sie sich keine Sorgen machen - es ist die Standarddefinition von "Epoche". Alles, was für Sie angezeigt wird, kann in Ortszeit, UTC-Zeit oder einer beliebigen Zeitzone angezeigt werden.
BeccaP
23

So würde ich es machen

// Used to examplify deletion of files more than 1 month old
// Note the L that tells the compiler to interpret the number as a Long
final int MAXFILEAGE = 2678400000L; // 1 month in milliseconds

// Get file handle to the directory. In this case the application files dir
File dir = new File(getFilesDir().toString());

// Obtain list of files in the directory. 
// listFiles() returns a list of File objects to each file found.
File[] files = dir.listFiles();

// Loop through all files
for (File f : files ) {

   // Get the last modified date. Milliseconds since 1970
   Long lastmodified = f.lastModified();

   // Do stuff here to deal with the file.. 
   // For instance delete files older than 1 month
   if(lastmodified+MAXFILEAGE<System.currentTimeMillis()) {
      f.delete();
   }
}
Lars Rye Jeppesen
quelle
2
+1 Diese Antwort gefällt mir am besten. Ich habe das in einem Thread ausgeführt und es hat ziemlich gut funktioniert. Lieben Sie auch den Variablennamen MAX_FILEAGE: P
Ryan R
6
Sie beantworten die Frage nicht. Dies ist das Datum der letzten Änderung der Datei.
stef
22

Das Erstellungsdatum der Datei ist kein verfügbares Datenelement, das von der Java- FileKlasse verfügbar gemacht wird . Ich empfehle Ihnen zu überdenken, was Sie tun, und Ihren Plan zu ändern, damit Sie ihn nicht brauchen.

CommonsWare
quelle
1
Das ist falsch. Datei unterstützt dies, developer.android.com/reference/java/io/…
Fuzzy
11
@Fuzzy: Das ist die zuletzt geänderte Zeit. Es ist nicht die Zeit für die Dateierstellung, wenn die Datei geändert wurde.
CommonsWare
10

Ab API-Level 26 können Sie Folgendes tun:

File file = ...;
BasicFileAttributes attr = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
long createdAt = attr.creationTime().toMillis();
Steve Strates
quelle
1
Ja, aber ich muss 3-4 Jahre warten, bis Geräte mit einer API unter 26 selten verwendet werden
user924
2
@ user924: Hängt von Ihrem Anwendungsfall ab. Wenn Sie eine App für sich selbst oder eine kontrollierte Umgebung (kleines Team) schreiben, können Sie dies heute tun. Gut zu wissen.
LarsH
7

Es gibt einen alternativen Weg. Wenn Sie die Datei zum ersten Mal öffnen, speichern Sie das Datum der letzten Änderung, bevor Sie den Ordner ändern.

long createdDate =new File(filePath).lastModified();

Und dann, wenn Sie die Datei schließen, tun

File file =new File(filePath);
file.setLastModified(createdDate);

Wenn Sie dies seit der Erstellung der Datei getan haben, haben Sie das Erstellungsdatum immer als das Datum der letzten Änderung.

coolcool1994
quelle
Interessante Idee, obwohl sie nur funktioniert, wenn Ihre App die Datei erstellt hat.
LarsH
3

Aus Gründen der Abwärtskompatibilität würde ich lieber Folgendes verwenden:

fun getLastModifiedTimeInMillis(file: File): Long? {
    return try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            getLastModifiedTimeFromBasicFileAttrs(file)
        } else {
            file.lastModified()
        }
    } catch (x: Exception) {
        x.printStackTrace()
        null
    }
}

@RequiresApi(Build.VERSION_CODES.O)
private fun getLastModifiedTimeFromBasicFileAttrs(file: File): Long {
    val basicFileAttributes = Files.readAttributes(
        file.toPath(),
        BasicFileAttributes::class.java
    )
    return basicFileAttributes.creationTime().toMillis()
}

Wenn Sie sich mit JPG oder JPEGs beschäftigen, können Sie alternativ ExifInterface verwenden

Lukas
quelle