【问题标题】:How to programmatically read Mac .textClipping files?如何以编程方式读取 Mac .textClipping 文件?
【发布时间】:2011-05-20 13:40:10
【问题描述】:

每当您将文本选择拖到 Finder 时,就会创建这些文件。文件大小始终为0 bytes。显然,数据存储在资源分支中。

我尝试读取资源 fork[1],但得到错误代码 -39(文件结尾)。

这里有一些关于文件的更多细节:

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

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

【问题讨论】:

  • 警告:macOS Sierra 和 High Sierra 的 Finder 的“压缩”在压缩时会破坏 .textClipping 文件上的资源分支。

标签: cocoa finder


【解决方案1】:

textClipping 文件是一种老式的资源派生文件。您需要使用FSOpenResourceFile 打开它,然后使用Get1Resource 从文件中读取资源。该文件可能包含几种不同的文本资源类型:“RTF”(富文本)、“utxt”(UTF-8)、“utf8”(UTF-8)或“TEXT”(ASCII)类型的资源,所有id 为 256。读取资源后,从句柄中提取数据并按照您的意愿进行处理。

【讨论】:

  • 如何访问不同的数据类型(我已经设法读取数据)?
【解决方案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:&error];
NSString *text;

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

【讨论】:

  • 您可以使用 '$ plutil --convert xml1 file.textClipping' 转换为 xml。执行 man plutil,并执行 plutil -help 以获取更多信息。除非您使用 -o 文件名,否则它将覆盖原始文件。 (这是在 mojave 10.14 中)
【解决方案3】:

查找 FSOpenFork 和 FSReadFork。 (Apple 有一个名为 AudioCDSample 的代码示例)。

还有一个可以读取这些文件的命令行工具(/usr/bin/DeRez),你可能想在 GDB 下查看它,但据我所见使用已弃用的 API(即 FSRead 代替 FSReadFork)。

【讨论】:

猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2020-01-12
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多