Dart - 如何获取文件的创建时间?

Leo*_*ese 2 datetime file dart flutter

我需要在我的 Flutter 项目中获取文件的创建时间,但我从File对象中获得的只是lastModified()and lastAccessed(),没有任何方法来获取DateTime创建时间。

我看到在 Java 中是可能的:https : //stackoverflow.com/a/2724009/3997782 以及在 Swift 中:https : //stackoverflow.com/a/6428757/3997782

我可以使用 FlutterMethodChannel函数来获得它,但我想知道是否有一种原生的 Dart 方式来获得它。

如何获取本地文件信息,比如文件创建时间

jul*_*101 5

并非所有平台都有文件创建时间的概念。例如,Linux 并不适用于所有文件系统,并且通用stat()调用不提供该信息。

这并不意味着您无法访问似乎是创建时间的内容。但是您不必相信它的价值,Java API 中也记录了这些价值:

返回创建时间。创建时间是创建文件的时间。

如果文件系统实现不支持时间戳来指示文件创建的时间,则此方法返回实现特定的默认值,通常是上次修改时间或表示纪元的 FileTime (1970-01-01T00: 00:00Z)。

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

如果您使用FileStat具有此属性的类,Dart 确实具有类似的 API :

日期时间已更改

上次更改文件系统对象的数据或元数据的时间。

在 Windows 平台上,这是文件创建时间。

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

但是 FileStat 的数据被记录为来自 POSIXstat()系统调用,它没有文件创建时间戳的概念,但具有以下内容:

    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 */
Run Code Online (Sandbox Code Playgroud)

这映射到您可以从中获得的三个时间戳FileStat

import "dart:io";

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

但是正如您在带有 XFS 的 Linux 上看到的那样,对于已更改和已修改,它将返回相同的值:

import "dart:io";

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

changed如果您例如更新 inode 信息,您可以获得不同的时间:

[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
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为st_ctime记录为:

字段 st_ctime 通过写入或设置 inode 信息(即所有者、组、链接计数、模式等)来更改。

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

简而言之,您应该尝试看看 iOS 和 Android 在使用FileStat. 但简而言之,很难编写一个独立于平台的 API 来访问每个平台的差异。特别是对于像 Linux 这样的平台,如果某个功能存在与否,则取决于每个文件系统。