7

我想在我的应用程序中显示“上次打开”日期,就像在 Finder 预览或信息面板中一样。但是我意识到这与我将获得的最后访问日期不同

NSDate* lastAccessDate = [fileUrl resourceValuesForKeys:@[NSURLContentAccessDateKey] error:NULL][NSURLContentAccessDateKey];

或与

struct stat buf;
stat(curName, &buf);
time_t lastAccessDate = buf.st_atimespec.tv_sec;

这些返回 Unix 上次访问时间,它也显示在终端中,ls -l 但是 Finder 显示不同的值,该值仅在用户打开文件时才会更改(例如通过双击)


我读了帖子'获取真正的“最后打开”日期?'“最后打开”日期',但这些并没有解决它。他们推荐类似的东西

MDItemRef itemRef = MDItemCreateWithURL(NULL, (__bridge CFURLRef)fileUrl);
NSArray *attributeNames = (__bridge NSArray *)MDItemCopyAttributeNames(itemRef);
NSDictionary *attributes = (__bridge NSDictionary *) MDItemCopyAttributes(itemRef, (__bridge CFArrayRef) attributeNames);
CFDateRef lastUsedCfDate = MDItemCopyAttribute(itemRef, kMDItemLastUsedDate);
NSDate* lastUsedDate = (__bridge NSDate*) lastUsedCfDate;
CFRelease(itemRef);

attributeNames没有价值kMDItemLastUsedDate。在我的情况下,该数组中恰好有 24 个值,但没有最后一次使用。lastUsedDate也是nil... _

另外我想知道是否真的没有高级 API 可以访问最后打开的日期。

4

2 回答 2

0

http://forums.macrumors.com/showthread.php?t=855913

引用 chown33:

扩展属性与元数据完全不同。Xattrs 附加到文件中,作为文件系统的一部分存储。元数据从文件中提取,存储在元数据存储(本质上是 Spotlight 的数据库)中。一些 xattr 被提取并存储在元数据存储中,但它们仍然是两个独立的东西。

对元数据进行操作的命令符合“md*”通配模式:mdfind、mdls、mdutil 等。

...

您通常不会更新任何元数据值。这是设计使然,从我通过查看低级 API 可以看出。

于 2014-05-12T16:07:33.697 回答
0

我遇到了同样的问题。我发现当 Finder 遇到kMDItemLastUsedDate密钥不可用的情况时,它会kMDItemFSContentChangeDate改为显示密钥的值。

于 2016-04-22T10:46:35.933 回答