设置空文件和创建者类型

好的,我刚刚演示了如何设置HFS文件和创建者类型使用AppleScript,Perl和shell脚本但是,如果你不想这样做类型,但相反去掉它们,以便允许Launch Services从文件扩展名中确定文件类型和默认应用程序?

是的,我是文件类型和创建者元数据的忠实粉丝但支持文件类型和创建者元数据并不与支持启动服务样式的文件扩展名应用程序分配互斥。反HFS元数据宣传尽管如此,Mac OS X目前提供了一种两全其美的方法来确定文件如何绑定到默认应用程序。

最优先考虑通过Finder的Get Info命令分配的自定义每文件绑定这些存储在文件的资源分支中,在'ICNS'和'usro'资源,其中,正如Michael Tsai所说鉴于Apple在Mac OS X时代对资源分叉的反感,有点令人惊讶HFS创建者类型元数据具有第二优先级,其次是文件扩展名。

(与普遍的误解相反,HFS文件和创建者类型是存储在资源分支中的,它们只是文件系统本身定义的元数据字段,就像文件名和日期字段一样。)

此层次结构(其中创建者类型优先于文件扩展名)效果很好(你可以看到使用Rainer Brockeroff的层次结构XRay文件信息工具。)

In general, the way I tend to make use of these rules is to rely on file type and creator metadata for files that I’m working on, but let filename extensions control files that I only want to read or viewIf it’s an HTML file I’m editing, I want it to open in BBEdit; if it’s an HTML file I just want to read, however, then I want it to open in my default web browser因此,如果我切换到新的默认Web浏览器,任何没有创建者类型的HTML文件都会自动切换到我。

但是,如何从脚本中删除文件和创建者类型?

显而易见的解决方案是将值设置为空字符串例如,在AppleScript中:

tell application "Finder"
   set file type of this_file to ""
   set creator type of this_file to ""
end tell

或者在Perl中:

MacPerl :: SetFileInfo('','',@ ARGV);

但这不起作用In the AppleScript version, the Finder fails with an error: “Can’t make some data into the expected type.” The Perl version runs without error, but the file type and creator fields end up getting set to garbage values, rather than empty strings.

The problem is that HFS file and creator types aren’t really strings; they’re OSType values, which are exactly four bytes将四字节OSType值视为四字符MacRoman编码字符串相对容易,因此通常显示它们的方式将4个字符的字符串强制转换为OSType也很容易但是,你不能做的是强制OSType一个任何其他长度的字符串例如,PDF文件的文件类型是PDF', 反而 'PDF ',有一个尾随空间。

因此上述脚本片段存在问题 - 您无法将零长度字符串强制转换为四字节OSType。

在20世纪90年代的某个时间点,Apple批准的指定“未知”文件和创建者类型的方法是使用值'????”据我所知,这不再是官方认可的,但似乎确实有效 - 如果你将文件的创建者和文件类型设置为'????',Finder似乎对它的处理方式与未打字的文件相同同样的价值'    '(四个空格)。

但这些是解决方法,而不是真正的解决方案我的朋友兼前同事Jim Correia为我提供了解决方案诀窍是像C / C ++程序员(像Jim)一样思考,而不是像我这样的脚本编写者我正撞在墙上,试图将一个空字符串强制转换成一个空的OSType但是OSType值永远不会真正“空” - 它们总是恰好是四个字节看起来像“空”的OSType实际上是四个字节,每个字节的值为零

Jim’s AppleScript solution:

on main(filelist)
   set nullCh to ASCII character 0
   set nullFourCharCode to nullCh & nullCh & nullCh & nullCh
   repeat with this_file in filelist
      try
         tell application "Finder"
            set file type of this_file to nullFourCharCode
            set creator type of this_file to nullFourCharCode
         end tell
      on error error_message
         display dialog error_message
      end try
   end repeat
end main

ASCII字符0is a byte with the value zero; so we just create a string consisting of four of these characters, and we’re in business.

Here’s my translation to Perl:

#!/usr/bin/perl
use strict;
use warnings;
use MacPerl;
MacPerl::SetFileInfo("\0\0\0\0", "\0\0\0\0", @ARGV);

(另外,谢谢克里斯南多尔- 谁维护整个Mac :: Carbon Perl模块包,包括MacPerl - 通过电子邮件指出SetFileInfo()可以采取名单文件参数,避免我昨天在我原来的Perl脚本中使用的循环。)

以前: 脚本文件和创建者类型
下一个: 48小时