目标 c - 查找器从何处获取文件夹中项目的"date added"?



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

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

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;
}

注意:现在狮子已经出局了。

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

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

public extension URL {
    var dateAdded: Date? {
        if let metadataItemValue = MDItemCreateWithURL(kCFAllocatorDefault, (self as CFURL)) {
            return MDItemCopyAttribute(metadataItemValue, kMDItemDateAdded) as? Date
        }
        return nil
    }
}
我已经在 Swift

4.x 上测试了它,我认为如果你也需要的话,它会在不加修改的情况下编译回 Swift 3.x。请注意,在 Swift 5 之前,其推断的可见性将是internal而不是public