Swift - Как изменить метаданные файла, такие как kMDItemDisplayName?

Я пытаюсь найти способ изменить атрибуты метаданных файла (те, с префиксом "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),

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

_ = 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам