Swift - Как изменить метаданные файла, такие как kMDItemDisplayName? - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь найти способ изменить атрибуты метаданных файла (с префиксом «kMDItem», перечисленным mdls), но я не нашел никакого решения для этого.ToT

Сначала я попытался использовать FileManager.default.setAttributes(_attributes:ofItemAtPath:), но этот метод дает мне только несколько опций, он только дает мне возможность изменять файлы modification date, creation date и posix permissions и т. Д., чего недостаточно.

Затем я попытался использовать NSMetadataItem с функцией setValue(_value:forKey:) для изменения значения метаданных, это мой код:

var attributes = NSMetadataItem(url: URL(fileURLWithPath: "/path/to/file")
if let metadata = attributes {
    metadata.setValue(newValue, forKey: kMDItemDisplayName as String)
    metadata.setValue(newValue, forKey: NSMetadataItemDisplayNameKey)
    // I've tried both of them from above (different keys), they both does not work at all
}

Я заметил, что setValue(_value:forKey:) ничего не делает здесь, постоянно получая эту возвращаемую ошибку: error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

Наконец, я читаю этот пост в StackOverflow, что привело меня к этому коду:

_ = setxattr("/path/to/file".cString(using: .utf8), "kMDItemDisplayName", newValue.cString(using: .utf8), newValue.lengthOfBytes(using: .utf8), 0, 0)

После его выполнения я использовал mdls и xattr -l для проверки результата, я понял, что это только решение для добавления расширенных атрибутов в файл, метаданные не изменились, только расширенный атрибутс именем «kMDItemDisplayName» успешно добавлено.

Результат не тот, который я хочу ( Я просто использую kMDItemDisplayName в качестве примера для моего вопроса ), я не просто хочунайти способ добавить расширенные атрибуты в файл, номожно редактировать атрибуты, перечисленные mdls.Может быть, нет решения для этого?Или, может быть, я должен сделать это совершенно по-другому?

1 Ответ

0 голосов
/ 16 февраля 2019

Не все метаданные могут быть изменены.Большая часть этого не хранится напрямую, она выводится или вычисляется на основе других метаданных.

Отображаемое имя для простого файла происходит от его имени на диске и системных настроек, например, скрыты ли расширения или показаны.Отображаемое имя для пакета (например, приложения) немного сложнее, но, если вы не сочтете приемлемым изменение содержимого пакета (что может нарушить его кодовую подпись), это то же самое.Они зависят от языка (ов) системы.

Существуют также определенные папки, имена которых можно локализовать для отображения, но они все еще основаны на их имени на диске.

Итак, чтобыизмените отображаемое имя файла, измените его фактическое имя на диске.

Для других свойств вы можете посмотреть URL.setResourceValues(_:) и URLResourceValues, чтобы увидеть, какие свойства можно установить.Вы также можете посмотреть на URLResourceKey, чтобы увидеть, что задокументировано как «чтение-запись».

...