使用 swift 在 OS X 上获取所有可用的文件夹元数据
Getting all available folder metadata on OS X using swift
我正在编写一个 swift 程序,我想使用 swift 列出给定文件夹的所有元数据。据我了解,我需要 NSMetadataItem
。 reference 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)
我正在编写一个 swift 程序,我想使用 swift 列出给定文件夹的所有元数据。据我了解,我需要 NSMetadataItem
。 reference 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)