Android: Як отримати дату створення файлу?


75

Це мій код:

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..?
    }
}

6
Якщо ви хотіли створити час, чому ви прийняли змінений час? stackoverflow.com/questions/2723838/…
М,

Відповіді:


192

Дата створення файлу недоступна , але ви можете отримати дату останньої зміни :

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

System.out.println("File last modified @ : "+ lastModDate.toString());

1
використовувати останній змінений заголовок HTTP.
AhmetB - Google

5
Як зазначає @CommonsWare, час останнього модифікованого - це не час створення. Час створення недоступний.
Мігель

1
будь ласка, прочитайте спочатку, використання останньої модифікації є варіантом, оскільки час створення недоступний.
Jorgesys

2
Я пропускаю лише одну інформацію - це чітка специфікація того, чи є File.lastModified місцевим часом або UTC. Консенсус полягає в тому, що це UTC stackoverflow.com/questions/5264339/…, і це також те, що я очікував у напівсучасній системі. Але чому б чітко це не вказати розробник специфікацій Oracle.android.com/reference/java/io/…? "... вимірюється в мілісекундах з 1 січня 1970 року, опівночі". можна, якщо хтось є достатньо параноїчним, трактувати як UTC 1 січня 1970 р., опівночі, або місцевий 1 січня 1970 р. опівночі.
RenniePet

2
Він зберігається в мілісекундах з 1 січня 1970 року за UTC, але про це вам не потрібно турбуватися - це стандартне визначення "епохи". Відображення будь-якої дати для вас може відображатися за місцевим часом або часом UTC або будь-яким часовим поясом.
BeccaP

23

Ось як би я це зробив

// 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();
   }
}

2
+1 Ця відповідь мені найбільше подобається. Я провів це в нитці, і це працювало досить добре. Крім того, полюбіть ім’я var MAX_FILEAGE: P
Ryan R

6
Ви не відповідаєте на запитання. Це дата останнього зміни файлу.
stef

22

Дата створення файлу не є доступною частиною даних, яку відкриває Fileклас Java . Я рекомендую вам переосмислити те, що ви робите, і змінити свій план, щоб він вам не знадобився.


1
Це неправильно. Файл це підтримує, developer.android.com/reference/java/io/…
Нечітке

11
@Fuzzy: Це час останньої модифікації. Це не час створення файлу після того, як файл було змінено.
CommonsWare

10

Починаючи з рівня API 26, ви можете зробити це:

File file = ...;
BasicFileAttributes attr = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
long createdAt = attr.creationTime().toMillis();

1
так, але доводиться чекати 3-4 роки, поки пристрої з API нижче 26 не стануть рідко використовуватися
user924

2
@ user924: Залежить від випадку використання. Якщо ви пишете програму для себе або контрольованого середовища (невелика команда), ви можете зробити це сьогодні. Добре знати про.
LarsH,

8

Існує альтернативний спосіб. Коли ви вперше відкриваєте файл, збережіть дату останньої зміни, перш ніж змінювати папку.

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

А потім, коли ви закриєте файл, зробіть

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

Якщо ви робили це з моменту створення файлу, то ви завжди будете мати дату created як дату останньої модифікації.


Цікава ідея, хоча вона працює лише в тому випадку, якщо ваш додаток створив файл.
Ларш

3

Маючи на увазі зворотну сумісність, я б скоріше використав наступне:

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()
}

або, якщо ви маєте справу з jpg, jpegs , ви можете використовувати ExifInterface

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.