Futurebasic/语言/文件文件夹
在 FB 中,有很多语句和函数需要你指定特定文件和/或特定目录。目录本质上就是文件夹;此外,每个卷(基本上,每个磁盘)都有一个根目录,其名称与卷本身相同。目录是一个容器;当你在 Finder 中双击文件夹图标时,你会看到一个窗口,其中显示该目录的内容。同样地,当你双击卷图标时,你会看到一个窗口,其中显示该卷根目录的内容。
随着 MacOS 的发展,已经出现了一些不同的方案来指定文件和目录。FB 中的语句和函数使用一种涉及三种不同信息片段的系统,这些信息片段以有时微妙的方式相互作用。这些信息片段分别是:路径名、目录引用号和目录 ID 号。
在 MacOS 中,路径名是一个不超过 255 个字符的字符串,由冒号和/或文件和目录名称组成,采用特定格式。在手册的语法描述中,它通常被标识为 path$
。
- 一个 完整路径名 以卷的名称开头,以该卷内某个地方的文件或目录的名称结尾。中间是卷根级到最终项目的目录层次列表;列表中的名称用冒号隔开。如果列表中的最后一个项目是目录,则可以选择在其后添加一个最后的冒号。完整路径名 总是 至少包含一个冒号,但从不以冒号开头。仅包含卷名后跟一个冒号的完整路径名,表示卷的根目录。
- 一个 部分路径名 或者以冒号开头,或者仅由单个项目的名称组成,不含冒号。它表示相对于某个“基本目录”(下面讨论)的层次目录路径。不包含冒号的部分路径名表示基本目录的第一级上的一个项目。仅由冒号组成的部分路径名(不包含项目名称)表示基本目录本身。部分路径名也可以以 多个 冒号开头:一个前导双冒号表示路径从基本目录的 父目录 开始;一个前导三冒号表示路径从基本目录的“祖父母目录”开始,依此类推。
这是一个奇怪的概念,由于历史原因,它可以根据其值以多种不同的方式解释。它也可以根据另一个称为“目录 ID 号”的量(下面讨论)的值,被解释为表示卷,或者表示卷上的特定目录。目录引用号始终以“带符号短整型”数字存储,因此其值范围为 -32768 到 +32767。在手册的语法描述中,它通常被标识为 refNum%
。
注意:驱动器 ID 号在系统启动时分配给每个磁盘驱动器。卷引用号在卷安装时分配给每个卷,并且在卷卸载之前有效。工作目录引用号在你的应用程序的请求下分配给特定卷上的特定目录,并且在你的应用程序“关闭”该目录(如使用 CLOSE FOLDER
语句)或你的应用程序退出之前有效。
这是一个正数,当目录创建时,MacOS 会永久地分配给每个目录。在任何给定的卷上,没有两个目录 ID 号是相同的;但是,两个不同卷上的两个目录可能具有相同的目录 ID 号。
在那些使用目录 ID 号的 FB 语句(OPEN
、KILL
、NAME
、RENAME
)中,你可以使用两种不同的技术来指定该号码。
你可以将它明确地指定为语句的参数。在手册的语法描述中,它通常被标识为 dirID&
。如果你没有明确地指定它,FB 将使用你在 PARENTID
语句中指定的数字。如果你还没有执行 PARENTID
语句,FB 将使用零。此外,OPEN
、KILL
、NAME
和 RENAME
语句在语句执行后始终自动将 PARENTID
值重置为零。
注意:某些其他 FB 语句和函数(如 FOLDER
)不使用目录 ID 号,也不关注 PARENTID
值。另一种说法是:这些语句和函数始终表现得好像目录 ID 号为零。
FB 以以下方式使用路径名、目录引用号和目录 ID 号来识别你所指示的文件或目录。
- 如果路径名是一个 完整路径名,则忽略目录引用号和目录 ID 号。项目完全由路径名指定。(请注意,如果有两个已安装的卷都具有 相同的卷名,则完整路径名可能不明确。)如果路径名是一个 部分路径名(或未指定),则使用目录
- 引用号和目录 ID 号一起识别一个 基本目录。然后,相对于该基本目录找到由部分路径名标识的项目(或者,如果没有指定路径名,则该项目就是基本目录本身)。基本目录的确定方式如下。
- 如果目录 ID 号为 零,则完全根据目录引用号确定基本目录,如上表中的“目录解释”列所示。
- 如果目录 ID 号为 非零,则使用目录引用号和目录 ID 号一起识别基本目录。在这种情况下,基本目录的卷由目录引用号指示(如表中的“卷解释”列所示),目录 ID 号识别该卷内的目录。
当你调用 MacOS 工具箱例程时,在指定文件或文件夹时,并不总是需要使用上面讨论的三种数据项。在许多工具箱调用中,标识文件或文件夹的首选方法是使用 fileSpec,它是一个 70 字节的记录,包含卷引用号、目录 ID 号和项目的名称。要跟踪可能不在当前已安装卷上或可能已重命名或移动到不同文件夹的项目,首选方法是使用别名记录。有关 fileSpec 和别名记录的完整讨论,请参考 Inside Macintosh: Files。
请注意,许多 MacOS 工具箱例程也支持使用路径名、目录引用号(通常称为 ioVRefNum)
和目录 ID 号,使用与上面讨论的完全相同的交互规则。