在操作系统的某些文件中存在“上次打开”属性:
可以通过以下方式获取已修改和已打开的属性:
//modified date
try? FileManager.default.attributesOfItem(atPath: url.path)[FileAttributeKey.modificationDate] as? Date
//creation date
try? FileManager.default.attributesOfItem(atPath: url.path)[FileAttributeKey.creationDate] as? Date
但如何获得“最后打开”的日期?
1条答案
按热度按时间vulvrdjw1#
当然,没有办法获取文件最后一次被打开的时间。相反,你必须获取文件最后一次被读取、写入的时间,或者它的目录项被修改的时间。
Leo在评论中建议使用
URLResourceValues.contentAccessDate
作为另一个答案,这可能是最简洁的方法,特别是因为您已经有了一个URL,这是目前的典型情况。您还可以使用以下路径向下访问BSD层:
如果指定的URL是一个符号链接,我不是100%的
resourceValues
的行为,但是stat()
将返回链接指向的文件系统inode的信息。如果你想直接获得链接本身的信息,请使用lstat()
。否则stat()
和lstat()
是相同的。我非常确定
URLResourceValues.contentAccessDate
在引擎盖下使用stat()
或lstat()
。需要记住的一点是,上次访问时间 * 不是 * 上次打开文件的时间,而是上次 * 读取 * 文件的时间。
stat
的man
页面显示:struct stat的时间相关字段如下:
st_atime上次访问文件数据的时间。由mknod(2)、utimes(2)和read(2)系统调用更改。
st_mtime上次修改文件数据的时间。由mknod(2)、utimes(2)和write(2)系统调用更改。
st_ctime上次更改文件状态(inode数据修改)的时间。通过chmod(2)、chown(2)、link(2)、mknod(2)、rename(2)、unlink(2)、utimes(2)和write(2)系统调用进行更改。
st_birthtime创建文件的时间。仅在创建文件时设置一次。此字段仅在64位inode变体中可用。在没有birthtime的文件系统上,此字段设置为0(即epoch)。
man
页引用32位成员字段名称,但同样的情况也适用于64位名称st_atimespec
、st_mtimespec
、st_ctimespec
和st_birthtimespec
。为了近似获取文件最后一次打开的时间,你可能需要获取
st_atimespec
、st_mtimespec
的最新版本,如果你还想包含对目录项的更改,而这些更改不会修改内容,比如重命名文件或设置其权限,那么你可能需要这样的东西:或使用
URLResourceValues
当然,如果某个进程只是打开了一个文件,然后在没有阅读的情况下关闭了它,这将不会引起注意,但是如果它没有读写,它打开了文件又有什么关系呢?