Как программно читать файлы Mac .textClipping? - PullRequest
4 голосов
/ 20 мая 2011

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 22 мая 2011

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

2 голосов
/ 06 января 2017

Похоже, в 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:&error];
NSString *text;

if (plist && error == nil) {
  NSDictionary *utiData = [plist objectForKey:@"UTI-Data"];
  text = [utiData objectForKey:@"public.utf8-plain-text"];
}
1 голос
/ 21 мая 2011

Поиск FSOpenFork и FSReadFork .(У Apple есть пример кода AudioCDSample ).

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

...