我想在我的应用程序中显示“上次打开”日期,就像在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会显示一个不同的值,该值仅在用户打开文件时更改(例如,通过双击)
我阅读了帖子'Get the real “last opened” date?'和'“Last Opened” Date',但这些都没有解决。他们建议像
这样的东西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来访问上次打开的日期。
答案 0 :(得分:0)
http://forums.macrumors.com/showthread.php?t=855913
引用chown33:
扩展属性与元数据完全不同。 Xatt附加到文件,作为文件系统的一部分存储。元数据从文件中提取,存储在元数据存储(本质上是Spotlight的数据库)中。一些xattrs被提取并存储在元数据存储中,但它们仍然是两个独立的东西。
对元数据进行操作的命令符合'md *'通配模式:mdfind,mdls,mdutil等。
...
您通常无法更新任何元数据值。这是设计,通过查看低级API我可以看到。
答案 1 :(得分:0)
我遇到了同样的问题。我发现当Finder遇到kMDItemLastUsedDate
密钥不可用的情况时,它会显示kMDItemFSContentChangeDate
密钥的值。