【发布时间】:2013-05-29 17:31:36
【问题描述】:
我想在我的应用程序中显示“上次打开”日期,就像在 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 可以访问最后打开的日期。
【问题讨论】:
-
mdls(在终端上)是否显示kMDItemLastUsedDate的条目?另外,请注意您正在泄漏attributes和lastUsedCfDate。 -
啊,我用
mdls玩了一下,发现kMDItemLastUsedDate没有设置为已复制但尚未打开的文件。但是,Finder 也会显示这些文件的最后打开时间。我可以手动设置kMDItemLastUsedDate吗?我问,因为我想复制文件并将所有属性设置为源文件的值。 -
我不确定您是否可以像使用
xattr(命令行实用程序和 API)一样设置 Spotlight 属性,除非您编写 Spotlight 导入器。你是如何复制文件的?你试过copyfile(3)吗?cp -p复制了一些属性,但不复制kMDItemLastUsedDate。
标签: macos cocoa core-foundation hfs+