如何以编程方式读取Mac的.textClipping文件?

7

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

我尝试读取资源派生文件[1],但出现错误代码-39(文件结尾)。

以下是有关该文件的更多详细信息:

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

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

参考链接介绍了如何使用资源叉来处理Mac OS X上的文件。


1
警告:在macOS Sierra和High Sierra中,Finder的“压缩”功能会破坏.textClipping文件的资源分支。 - Cerniuk
3个回答

5

文本剪贴文件是一种老式的资源叉文件。您需要使用 FSOpenResourceFile 打开它,然后使用 Get1Resource 从文件中读取资源。该文件可能包含几种不同的文本资源类型:'RTF ' (富文本),'utxt' (UTF-8),'utf8' (UTF-8) 或 'TEXT' (ASCII) 类型的资源,所有这些资源的 id 都为 256。一旦读取资源,从 Handle 中提取数据并对其进行操作。


我该如何访问不同的数据类型(我已经成功读取了数据)? - Mark

3

看起来在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
您可以使用“$ plutil --convert xml1 file.textClipping”将其转换为xml。请查看plutil手册,并使用plutil -help获取更多信息。它会覆盖原始文件,除非您使用-o filename选项。(此操作适用于mojave 10.14) - OsamaBinLogin

2
请查阅 FSOpenForkFSReadFork。(苹果公司有一个名为AudioCDSample的代码示例)。
此外,还有一个命令行工具可以读取这些文件(/usr/bin/DeRez),您可能想在GDB下查看它,但据我所见,它使用了已弃用的API(即FSRead代替FSReadFork)。

代码示例在该链接上已不再可用,但可以在此镜像的Stuffit存档中找到:http://mirror.informatimago.com/next/developer.apple.com/samplecode/AudioCDSample/AudioCDSample.html。 - hippietrail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接