Finder 从哪里获取文件夹中项目的“添加日期”?

Where does the Finder obtain the "date added" of an item in a folder?

提问人:CRD 提问时间:5/15/2011 更新时间:11/17/2023 访问量:1542

问:

如果文件夹放置在 Dock 中,您可以按“添加日期”对其进行排序 - 这通常是“下载”文件夹的默认设置。(有时,Finder 似乎没有使用添加的日期,而是使用修改的日期,但它可以找到添加的日期。Finder从哪里弄清楚这一点?标准文件元数据,即通过 stat、getattrlist 或 FSGetCatInfo 获取的元数据)不包含它。TIA系列

Objective-C macos-carbon

评论


答:

1赞 Jens Ayton 5/15/2011 #1

注意:现在已经过时了,因为狮子已经出来了。

Finder 不是,Dock 是。它在内部跟踪此数据。如果删除文件夹并将其放回原处,则现有项目的“添加日期”信息将丢失。

评论

0赞 CRD 5/16/2011
听起来很合理。但看看<appleinsider.com/articles/11/02/27/......> - 现在这是一个谣言网站,有些人可能会说这些照片都是假的,但它确实显示了 Lion Finder 支持按添加日期排序......因此,也许 Apple 正在将此跟踪添加到操作系统(文件系统内或文件系统外)或 10.7 中的 Finder?
0赞 Jens Ayton 5/16/2011
完全有可能,而且这并不难做到。但它还没有到那一步。
0赞 CRD 5/17/2011
我希望我错过了一些东西,添加的日期可以从其他结构中推断出来,但没有答案。至于 Lion 可能/可能不会做什么,这是一个错误的论坛来讨论这个问题!
0赞 swapnil patel 8/23/2018
@JensAyton 那么如何获取所有文件夹的日期呢?
13赞 Wojtek 8/4/2011 #2

是的,添加的日期可以从其他结构中推断出来。事实上,它驻留在 Spotlight 元数据中。

NSDate *dateAdded(NSURL *url)
{
    NSDate *rslt = nil;
    MDItemRef inspectedRef = nil;

    inspectedRef = MDItemCreateWithURL(kCFAllocatorDefault, (CFURLRef)url);
    if (inspectedRef){
        CFTypeRef cfRslt = MDItemCopyAttribute(inspectedRef, (CFStringRef)@"kMDItemDateAdded");
        if (cfRslt) {
            rslt = (NSDate *)cfRslt;
        }
    }
    return rslt;
}
2赞 Ky - 8/4/2019 #3

以下是 Wojtek 答案Swift 5.x 版本:

public extension URL {
    var dateAdded: Date? {
        guard let metadataItemValue = MDItemCreateWithURL(kCFAllocatorDefault, (self as CFURL)) else {
            return nil
        }
        return MDItemCopyAttribute(metadataItemValue, kMDItemDateAdded) as? Date
    }
}

我已经在 Swift 4.x 中对其进行了测试,如果您也需要它,我认为它可以不加修改地编译回 Swift 3.x。请注意,在 Swift 5 之前,其推断的可见性将是内部的,而不是公开的。