Как программно прочитать файлы Mac .textClipping?

#cocoa #finder

#cocoa #поисковик

Вопрос:

Эти файлы создаются всякий раз, когда вы перетаскиваете выделенный текст в Finder. Размер файла всегда 0 bytes . По-видимому, данные хранятся в разветвлении ресурсов.

Я попытался прочитать раздел ресурсов [1], но получил код ошибки -39 (конец файла).

Вот еще несколько подробностей о файле:

 $>xattr  test.textClipping 
com.apple.FinderInfo
com.apple.ResourceFork
  

[1] http://www.cocoadev.com/index.pl?UsingResourceForks

Комментарии:

1. Предупреждение: «Сжатие» в macOS Sierra и High Sierra Finder уничтожает разветвление ресурсов для файлов .textClipping при сжатии.

Ответ №1:

Файл textClipping — это старомодный файл с разделением ресурсов. Вы захотите открыть его с помощью FSOpenResourceFile , а затем использовать Get1Resource для чтения ресурсов из файла. Файл может содержать несколько различных типов ресурсов для текста: ‘RTF’ (форматированный текст), ‘utxt’ (UTF-8), ‘utf8’ (UTF-8) или ‘TEXT’ (ASCII) ресурсы типа, все с идентификатором 256. После того, как вы прочитаете ресурс, извлеките данные из дескриптора и делайте с ним, что хотите.

Комментарии:

1. Как я могу получить доступ к различным типам данных (мне удалось прочитать данные)?

Ответ №2:

Похоже, что в macOS 10.12 Sierra файл .textClipping теперь является списком свойств.

Корневой словарь имеет ключ «UTI-Data». В нем ключи: com.apple.traditional-mac-plain-text, public.utf16-plain-text и public.utf8-plain-text содержат несколько разных представлений данных.

Вот пример, который будет считываться из пути:

 NSString *path = @"/path/to/file.textClipping";
NSData *data = [NSData dataWithContentsOfFile:path];
id plist = [NSPropertyListSerialization propertyListWithData:data options:0 format:nil error:amp;error];
NSString *text;

if (plist amp;amp; error == nil) {
  NSDictionary *utiData = [plist objectForKey:@"UTI-Data"];
  text = [utiData objectForKey:@"public.utf8-plain-text"];
}
  

Комментарии:

1. Вы можете конвертировать в xml с помощью ‘$ plutil —convert xml1 file.textClipping’. Выполните man plutil и выполните plutil -справка для получения дополнительной информации. Он перезаписывает оригинал, если вы не используете -o filename. (это в mojave 10.14)

Ответ №3:

Найдите FSOpenFork и FSReadFork. (У Apple есть образец кода под названием AudioCDSample).

Существует также средство командной строки, которое может читать эти файлы (/usr / bin / DeRez), возможно, вы захотите посмотреть на него в GDB, но из того, что я видел, оно использует устаревшие API (т.Е. FSRead вместо FSReadFork).

Комментарии:

1. Пример кода больше недоступен по этой ссылке, но он доступен в виде архива stuffit на этом зеркале .