【问题标题】:The curious case of Plain text files with non .txt extension seen with Quicklook使用 Quicklook 看到的带有非 .txt 扩展名的纯文本文件的奇怪案例
【发布时间】:2015-06-25 09:24:45
【问题描述】:

在回答question 时,涉及将纯文本字符串写入具有非标准扩展名的文件。在这种情况下 .meta 但它可以是任何东西。

我注意到当我使用 Applescript 代码写出文件时。:

set meta_text to "alt " & alt_text & return & "copyright " & copyrightText & return & "signature " & signatureText

        set meta_file to open for access meta_path with write permission
        write meta_text to meta_file
        close access meta_file

使用 Quicklook 可以看到生成的文件的文本,并且 TextEdit.app 自动设置为默认应用程序来打开它。

在我将代码更改为使用 Objective - C 之前,我没有想到任何事情。(实际上是 ApplescriptOBJC,但在所有意图和目的上都是一样的)

BOOL success = [meta_text writeToFile: meta_file atomically:YES encoding:NSUnicodeStringEncoding error:nil];

发现生成的文件的文本可以通过 Quicklook 看到,并且 TextEdit.app 被自动设置为默认应用程序来打开它。

我意识到实际上后一种行为是我应该从两个代码执行中得到的。

谁能解释为什么存在这种差异以及如何让 Objective-C 代码设置(我假设)UTI,以便它也提供与 Applescript 代码相同的行为。

【问题讨论】:

    标签: objective-c macos file applescript uti


    【解决方案1】:

    AppleScript 正在将文件上的旧文件类型代码(OSType 四字符代码)设置为 TEXT,并将创建者代码设置为 ttxt。这是一个已弃用的机制,但显然 Launch Services 仍在使用它。如果两者都存在,我不知道它的相对优先级与文件扩展名的相对优先级是什么。

    您可以在NSFileManager的方法中指定文件类型和创建者代码:-createFileAtPath:contents:attributes:-setAttributes:ofItemAtPath:error:,使用属性键NSFileHFSTypeCodeNSFileHFSCreatorCode。您可以使用 [NSNumber numberWithUnsignedLong:'TEXT'] 之类的东西构造值。

    您可以使用mdls 命令查看系统可以从文件中提取哪些元数据属性。这将在 kMDItemFSTypeCodekMDItemFSCreatorCode 键下显示文件类型和创建者代码。您还可以使用GetFileInfo 命令查看旧式文件信息(这些代码以及各种标志)。

    【讨论】:

    • 感谢 Ken,我简要浏览了 NSFileManager 以寻找答案,但正在寻找 UTI。在属性中。当我回到 Mac 时,我会看看这个。
    • 嗨,Ken 成功了。我只是使用了NSFileHFSTypeCode,然后它允许 QuickLook 和 TextEdit 完成他们的工作。 (为了在 ApplescriptOBJC 中使用,我必须首先在 Xcode 中使用 Objective -c 获取无符号长 1413830740,然后复制该数字。无论我在 ApplescriptOBJC 中尝试什么,都不想与 NSNumber numberWithUnsignedLong:'TEXT' 打球。我在做这个在脚本编辑器中,它不喜欢单引号。所以我所有的工作都失败了"'TEXT'"«constant ****TEXT»等等。)
    【解决方案2】:

    您不能即时进行,但如果您愿意,则必须设置文件的 uti。您可以在 Objective-C Get the type of a file in Cocoa 中使用 CoreServices 框架来执行此操作。你可以阅读更多关于 uti 的here

    如果您阅读Nigel Garvey's post in Unscripted,您会看到他提到当您使用applescript 创建一个文本文件时,当您单击该文件时,open for access 命令(具有写入权限)会使用TextEdit 打开该文件。这样做的唯一方法是将文件的 uti 设置为 public.text,(只要没有使用 RCDefaultsApp 设置其他内容来打开文件。

    获得 ASOC 功能的简单方法当然是使用 StandarAdditions 命令来创建/写入文件。 :)

    编辑 正如 Ken Thomasses 在下面所写,您可以使用 ttxt 的创建者类型来使用 TextEdit 打开文件。 高温

    汤米

    【讨论】:

    • 不能设置文件的UTI。 UTI 永远不会存储在文件元数据中。 UTI 来自文件元数据,通常是文件扩展名,但可能是旧式文件类型代码。看我的回答。
    • 是的,我的立场是正确的。在返回这里之前,我进入了 Finder 的字典,唯一的选择是使用“老式”方法。
    • 我也学到了一些东西。 :) 顺便说一句,我在 Applescript 中使用了您的服务实现,用于非侵入式日志/时间跟踪器。明天看,因为我今天正在提高速度。 MacScripter / A journaling stop watch for mundane tasks and time slips
    • 你好,马克。我还在该帖子的底部添加了一个脚本,它设置了所有属性以提供服务,它有点原始,但它对我有用。如果你想在你的博客上写一篇关于创建服务的博文,你可以拿走它,并撕掉版权。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多