Дарт - Как я могу получить Время создания Файла? - PullRequest
1 голос
/ 07 апреля 2020

Мне нужно получить creationTime файла в моем проекте Flutter, но все, что у меня есть от File объекта, это lastModified() и lastAccessed(), никаких следов метода для получения DateTime создания.

Я вижу, что в Java это возможно: { ссылка }, а также в Swift: { ссылка }

Я мог бы использовать Флаттер MethodChannel функция, чтобы получить это, но я хотел бы знать, есть ли нативный способ дартс, чтобы получить это.

1 Ответ

2 голосов
/ 07 апреля 2020

Не на всех платформах есть понятие времени создания файла. Например, Linux подходит не для всех файловых систем, и общий вызов stat() не предоставляет эту информацию.

Это не означает, что вы не можете получить доступ к тому, что кажется временем создания. Но вам не обязательно доверять его значению, которое также задокументировано в Java API:

Возвращает время создания. Время создания - это время создания файла.

Если реализация файловой системы не поддерживает отметку времени для указания времени создания файла, тогда этот метод возвращает значение реализации, заданное c значением по умолчанию обычно это время последнего изменения или FileTime, представляющее эпоху (1970-01-01T00: 00: 00Z).

https://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/BasicFileAttributes.html#creationTime ()

У Dart действительно есть подобный API, если вы используете класс FileStat, который имеет это свойство:

Дата / время изменено

Время последнего изменения данных или метаданных объект файловой системы.

На Windows платформах это время создания файла.

https://api.dart.dev/stable/2.7.2/dart-io/FileStat/changed.html

Но документально подтверждено, что данные для FileStat поступают из системного вызова POSIX stat(), который не имеет концепции создания временных меток файлов, но имеет следующее:

    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */

который сопоставляется с тремя временными метками, которые можно получить от FileStat:

import "dart:io";

main() {
  final stat = FileStat.statSync("test.dart");
  print('Accessed: ${stat.accessed}');
  print('Modified: ${stat.modified}');
  print('Changed:  ${stat.changed}');
}

Но s, вы можете увидеть на Linux с XFS, он вернет одно и то же значение для измененных и модифицированных:

[julemand101@beta ~]$ dart test.dart
Accessed: 2020-04-07 18:19:20.404
Modified: 2020-04-07 18:19:19.020
Changed:  2020-04-07 18:19:19.020

Вы можете получить другое changed время, если вы, например, обновите информацию об узле:

[julemand101@beta ~]$ chmod +x test.dart
[julemand101@beta ~]$ dart test.dart
Accessed: 2020-04-07 18:19:42.341
Modified: 2020-04-07 18:19:19.020
Changed:  2020-04-07 18:19:39.397

Что имеет смысл, поскольку st_ctime задокументировано как:

Поле st_ctime изменяется путем записи или путем установки информации об узле (т. Е. Владельца, группы, количества ссылок, режима, et c.).

https://linux.die.net/man/2/stat

Короче говоря, вы должны попробовать и посмотреть, что происходит с iOS и Android при использовании FileStat. Короче говоря, сложно написать независимый от платформы API, который дает доступ к различиям на каждой платформе. Особенно для такой платформы, как Linux, где каждая файловая система может решать, существует ли такая функция или нет.

...