使用 swift 在 OS X 上获取所有可用的文件夹元数据

Getting all available folder metadata on OS X using swift

我正在编写一个 swift 程序,我想使用 swift 列出给定文件夹的所有元数据。据我了解,我需要 NSMetadataItemreference doc of NSMetadataItem 对我来说不是很清楚,所以我无法在这里编写代码示例。如何列出文件夹的所有元数据?

使用文件夹的 NSURL 初始化 NSMetadataItem 的新实例:

let item = NSMetadataItem(URL: folderURL)

然后安全地解包值:

if let item = item,
        attributes = item.valuesForAttributes(item.attributes) {
    print(attributes)
}

这里 attributes 是文件夹元数据属性的 [String : AnyObject] 字典,例如:

["_kTimeMachineIsCreationMarker": 1, "kMDItemFSCreationDate": 2015-03-09 11:49:57 +0000, "_kTimeMachineOldestSnapshot": 2016-01-29 14:50:21 +0000, "kMDItemFSNodeCount": 4, "kMDItemFSTypeCode": 0, "kMDItemFSLabel": 0, "kMDItemFSContentChangeDate": 2015-05-05 15:24:42 +0000, "kMDItemFSOwnerGroupID": 20, "kMDItemFSFinderFlags": 0, "kMDItemFSName": Shared Playground Data, "kMDItemContentCreationDate": 2015-03-09 11:49:57 +0000, "kMDItemKind": Dossier, "kMDItemFSIsExtensionHidden": 0, "_kTimeMachineNewestSnapshot": 4001-01-01 00:00:00 +0000, "kMDItemFSOwnerUserID": 501, "kMDItemFSInvisible": 0, "kMDItemContentTypeTree": <__NSArrayI 0x7f9fdbc05b70>( public.folder, public.directory, public.item ) , "kMDItemContentModificationDate": 2015-05-05 15:24:42 +0000, "kMDItemContentType": public.folder, "kMDItemDateAdded": 2015-03-09 11:49:57 +0000, "kMDItemDisplayName": Shared Playground Data, "kMDItemFSCreatorCode": 0]

您可以扩展 NSURL 以从您的 url 中获取所有元数据,如下所示:

extension NSURL {
    var metadataItemAttributes: [String]? {
        return  NSMetadataItem(URL: self)?.attributes
    }
    var creationDateValue: NSDate? {
        return  NSMetadataItem(URL: self)?.valueForAttribute(NSMetadataItemFSCreationDateKey) as? NSDate
    }
    var modifiedDateValue: NSDate? {
        return  NSMetadataItem(URL: self)?.valueForAttribute(NSMetadataItemFSContentChangeDateKey) as? NSDate
    }
    var nameValue: String? {
        return  NSMetadataItem(URL: self)?.valueForAttribute(NSMetadataItemFSNameKey) as? String
    }
    var displayNameValue: String? {
        return  NSMetadataItem(URL: self)?.valueForAttribute(NSMetadataItemDisplayNameKey) as? String
    }
    var fileSizeValue: Int? {
        return  (NSMetadataItem(URL: self)?.valueForAttribute(NSMetadataItemFSSizeKey) as? NSNumber)?.integerValue
    }
}

测试:

let desktopURL = NSFileManager.defaultManager().URLsForDirectory(.DesktopDirectory, inDomains: .UserDomainMask).first!

print(desktopURL.creationDateValue)