Чтение и запись тега файла в приложении какао OS X с помощью swift или obj-c

Есть ли способ читать/записывать теги файлов без команд оболочки? Уже пробовал NSFileManager и CGImageSource классы. Пока не повезло.

введите описание изображения здесь


person arsena    schedule 28.07.2016    source источник


Ответы (2)


Объект NSURL имеет ресурс для ключа NSURLTagNamesKey. Значение представляет собой массив строк.

Этот пример Swift читает теги, добавляет тег Foo и записывает теги обратно.

let url = NSURL(fileURLWithPath: "/Path/to/file.ext")
var resource : AnyObject?
do {
  try url.getResourceValue(&resource, forKey: NSURLTagNamesKey)
  var tags : [String]
  if resource == nil {
    tags = [String]()
  } else {
    tags = resource as! [String]
  }

  print(tags)
  tags += ["Foo"]
  try url.setResourceValue(tags, forKey: NSURLTagNamesKey)
} catch let error as NSError {
  print(error)
}

Версия Swift 3+ немного отличается. В URL свойство tagNames доступно только для чтения, поэтому необходимо выполнить мостовое приведение URL к Foundation NSURL.

var url = URL(fileURLWithPath: "/Path/to/file.ext")
do {
    let resourceValues = try url.resourceValues(forKeys: [.tagNamesKey])
    var tags : [String]
    if let tagNames = resourceValues.tagNames {
        tags = tagNames
    } else {
        tags = [String]()
    }

    tags += ["Foo"]
    try (url as NSURL).setResourceValue(tags, forKey: .tagNamesKey)

} catch {
    print(error)
}
person vadian    schedule 28.07.2016
comment
Большой! вы очень помогли. Спасибо. - person arsena; 28.07.2016
comment
И снова здравствуйте. Есть ли способ удалить существующий тег? например, removeResourceValue или что-то в этом роде? - person arsena; 01.09.2016
comment
Используйте setResourceValue с пустым массивом или если вы хотите, чтобы другие удаляли значение из массива и записывали его обратно. - person vadian; 01.09.2016

Ответ @vadian в Swift 4.0
('NSURLTagNamesKey' has been renamed to 'URLResourceKey.tagNamesKey')

    let url = NSURL(fileURLWithPath: "/Path/to/file.ext")
    var resource : AnyObject?
    do {
        try url.getResourceValue(&resource, forKey: URLResourceKey.tagNamesKey)
        var tags : [String]
        if resource == nil {
            tags = [String]()
        } else {
            tags = resource as! [String]
        }

        print(tags)
        tags += ["Foo"]
        try url.setResourceValue(tags, forKey: URLResourceKey.tagNamesKey)
    } catch let error as NSError {
        print(error)
    }
person leanne    schedule 16.11.2017