【问题标题】:How to programmatically get the "last opened" date like displayed in Finder如何以编程方式获取“最后打开”日期,如 Finder 中显示的日期
【发布时间】: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+


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    引用 chown33:

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

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

    ...

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

    【讨论】:

    • 很抱歉,但这并不能回答问题。我知道我可以使用 md* 命令获取聚光灯元数据。但我需要从 Cocoa 代码中执行此操作,我宁愿不创建命令行任务并进行控制台输出解析...
    • @codingFriend1,我将我的意图投射到你身上。我试图修改元数据,但根据我的发现,我认为答案是元数据系统旨在禁止它。重新阅读您的问题后,我发现您只是在尝试阅读元数据。
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多