【问题标题】:Dart - How can I get the creationTime of a File?Dart - 如何获取文件的创建时间?
【发布时间】:2020-07-19 20:24:48
【问题描述】:

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

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

我可以使用 Flutter MethodChannel 函数来获取它,但我想知道是否有本地 Dart 方法来获取它。

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

【问题讨论】:

    标签: file datetime flutter dart


    【解决方案1】:

    并非所有平台都有文件创建时间的概念。例如。 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 的数据被记录为来自 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}');
    }
    

    但正如您在带有 XFS 的 Linux 上所看到的,它会为更改和修改返回相同的值:

    [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 时间,例如更新inode信息:

    [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 通过写入或设置 inode 信息(即所有者、组、链接计数、模式等)来更改。

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

    简而言之,您应该尝试看看在使用FileStat 时iOS 和Android 会发生什么。但简而言之,很难编写一个独立于平台的 API 来访问每个平台的差异。尤其是对于像 Linux 这样的平台,是否存在某个功能取决于每个文件系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 2011-10-16
      • 2013-01-20
      • 2011-04-29
      • 2017-12-16
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多