从 HFS 字符串创建文件对象

Creating a file object from an HFS string

我正在通过各种在线文章和 yt 教程学习 AppleScript,并且我对整个文件和别名主题都一知半解。

根据这个 guide,(清单 15.8)我应该能够用行

创建一个文件对象

set theFile to file "Macintosh HD:Users:yourUserName:Desktop:My File.txt"

这会引发错误

Script Editor error

我进行了大量谷歌搜索,只找到 one reference 个问题:

Oddly, you can't assign a file object specifier to a variable, or return it as a value. If you try, you get a runtime error message:

set x to file "feathers:Users:mattneub:"
-- error: Can't make file "feathers:Users:mattneub:" into type reference

Instead, you must generate a reference to the file object, like this:

set x to a reference to file "feathers:Users:mattneub:"
x -- file "feathers:Users:mattneub:" of «script»

AppleScript Language Guide 中,通过伪 class POSIX file

创建了一个 file 对象

Working With Files
AppleScript uses file objects to represent files in scripts. A file object can be stored in a variable and used throughout a script. The following script first creates a file object for an existing file in the variable notesFile, then uses the variable in a tell statement that opens the file:

set notesFile to POSIX file "/Users/myUser/Feb_Meeting_Notes.rtf"
tell application "TextEdit" to open notesFile

我觉得这很奇怪!

据我了解,文件对象中的文件路径存储为 HFS,所以如果我想从 HFS 字符串创建文件对象,我需要

其中returns一个文件对象,路径再次存储为HFS字符串!

(虽然显然 POSIX 文件甚至不输出文件对象,而是一个文件 URL?!)

我的问题简而言之:为什么我不能通过将文件附加到 HFS 字符串来将变量设置为文件对象,如上面引用的清单 15.8 中所示? 我是否总是必须通过 POSIX 路径和 POSIX 文件?.

我想知道代码是否真的有效,只是它本身不行?我实际上还没有弄清楚为什么我需要或如何使用文件对象,所以我的理解可能是零散的...

在关于 POSIX 和 HFS 路径以及别名之间转换的教程中,我决定尝试将别名转换为文件对象并打开了这个蠕虫罐头。

非常感谢任何帮助,即使答案是:您永远不需要这样做,所以请忽略它!

这里你不明白说明书是怎么解释的。清单 15.8 准确地显示了使用 旧类型文件说明符 (file) 创建文件引用的错误尝试。这个说明符是过去遗留下来的,用于 AppleScript 命令,例如 readwrite.

手册清楚地显示了从 HFS 路径正确创建旧类型文件引用(文件):

set theFile to a reference to file "Macintosh HD:Users:yourUserName:Desktop:My File.txt"

稍后,您可以随时通过 AppleScript 命令 readwrite 使用 this reference .例如:

read theFile

此外,手册明确指出 还可以 使用 readwrite 命令而不首先创建一个单独的文件引用(变量 theFile 在你的情况下)。可以这么说,“即时”阅读或写作:

read file "Macintosh HD:Users:yourUserName:Desktop:My File.txt"

简短版本:AppleScript 是一个绝对的垃圾文件。

更长的版本:AppleScript 重载对象说明符以执行 2 个截然不同的任务:

  1. assemble 识别应用程序中数据的复杂查询,例如(在 Finder 中)file "bar" of folder "Downloads" of home

  2. 创建原始 AppleScript 类型的新实例,例如alias "Macintosh HD:Users:foo:Downloads:bar:".

Pre OS X,file STRING 说明符是语法 shorthand for file specification STRING,它创建了 AS 的 file specification 类型的新实例(#2 ).由于其技术限制,该类型在 OS X 中已被弃用和删除,但无论出于何种原因,构造它的 file STRING 说明符被保留 in-place 并被保留,以便至少一些应用程序将接受结果查询 (#1) 作为原始文件类型 (alias, POSIX file).

的替代

因此,如果您现在编写 [tell APPLICATION to] open file STRING,该语法 [通常] 有效,因为 AS 将 file STRING 查询 as-is 传递给应用程序的 open 命令进行处理。而如果你写 set f to file STRING,那会失败,因为 AS 不再知道如何为自己解析 file STRING [of AppleScript] 查询。

再一次,这一切都非常令人困惑,如果 Mac 自动化团队正确实施 POSIX file 并在 15 年前将所有人从那些不可靠的 HFS 路径中迁移出来,整个混乱本可以完全避免苹果脚本 2.0。但是,如果通向地狱的道路是用善意铺成的,那么 AppleScript 语法就是沿途散布的路障。

根据经验,如果您可以使用 POSIX file 类型并完全避免遗留的 HFS 混乱,您将全面避免很多痛苦:

set f to "/Users/foo/Downloads/bar/" as POSIX file -- convert string to file type

set p to POSIX path of f -- convert file to string type

注意使用强制转换 (STRING as POSIX file) 而不是对象说明符 (POSIX file STRING);强制是两者中麻烦较小的一个。

是的,POSIX file 无法正常工作,一些特别古老的 Mac 应用程序仍然坚持使用 HFS paths/types,即使 HFS 已被弃用 15 年以上。但是 AppleScript 已经到了生命周期的尽头,负责它的 Mac 自动化团队早已解散,所以你只需要在你仍然拥有它的时候充分利用你所拥有的废话。

TL;DR:您会明白为什么我将简短版本放在顶部。