参考内容:JavaScript Tool Guide 文件篇
文件与文件夹对象
使用文件和文件夹对象
Windows、Mac OS 和 UNIX 上的路径名语法不同, Adobe ExendScript 定义File
和Folder
对象,用于不同平台底层文件系统的访问。File 对象代表磁盘文件,Folder 对象代表目录或文件夹。
Folder
对象,支持文件系统,例如遍历层次结构;创建、重命名或删除文件;或解析文件别名。File
对象,支持输入/输出函数来读取或写入文件。
判断 File 和 Folder 对象。例如:
if ( f instanceof File ) // f是否属于文件
if ( typeof f.open == "undefined" ) ... // f文件夹未打开
[sc name="note" ]创建两个相同路径的 File 对象时,会被视为不同对象。打开其中一个用于 I/O,会禁止另一个对象的访问,因为磁盘文件已经打开。[/sc]
指定路径
创建文件或文件夹对象时,可以指定特定平台的路径名,或者以独立于平台的格式(通用资源标识符表示法,以下统称URI)指定绝对或相对路径。存储在对象中的路径始终是指向磁盘上固定位置的绝对完整路径名。
- toString 方法:获取文件或文件夹的名称,包含 URI 的绝对路径名。
fsName
属性:获取特定于平台的文件名。
绝对路径和相对路径
URI 中的绝对路径,从根目录到文件或文件夹的完整路径。以一或两个斜线 ( /
)开头,斜线用于分隔路径。例如,myFile.jsx
文件的绝对位置:
/dir1/dir2/mydir/myFile.jsx
URI 中的相对路径名附加到当前目录的路径,如存储在Folder 类的全局可用属性current
。它以文件夹或文件名开头,或者以当前目录.
或当前父目录..
的开头。斜线 ( /
) 分隔路径元素。例如,myFile.jsx
各种相对位置表示方法:
myFile.jsx | 在当前目录中。 |
./myFile.jsx | |
../myFile.jsx | 在当前目录的父目录中。 |
../../myFile.jsx | 在当前目录的祖父目录中。 |
../dir1/myFile.jsx | 在与当前目录平行的 dir1 中。 |
相对路径独立于不同机器和操作系统上的不同卷名,因此代码更具可移植性。例如可以对一个使用绝对路径,使用Folder.current 设置当前目录,其他的使用相对路径。只需更改一个代码即可更新到新平台或文件位置。
路径中的字符解释
不同平台解释方式存在差异:
- Windows 和 Mac OS 路径名不区分大小写。UNIX 则区分大小写。
- Windows ,斜杠 (
/
) 和反斜杠 (\
) 均有效。反斜杠\是转义字符,因此必须使用双反斜杠 (\\
) 来表示。 - Mac OS 上,斜杠 (
/
) 和冒号 (:
) 均为有效的路径元素分隔符。
如果路径名以两个斜杠(或 Windows 上的反斜杠)开头,则第一个元素指的是远程服务器。例如,//myhost/mydir/myfile
指的/mydir/myfile
是服务器myhost 上的路径。
URI 允许在路径名中使用特殊字符,但必须使用转义字符 (%) 后跟十六进制字符代码来指定它们。特殊字符是非字母数字且不是以下字符的字符:
、/ - - . ! ~ * ' ( )
例如,空格被编码为%20
,因此my file
→ my%20file
。
此编码方案与全局 JavaScript 函数encodeURI
和decodeURI
兼容.
主目录
路径名可以以波浪号 ( ~
)开头,代表用户主目录。对应于平台的 HOME
环境变量。
UNIX 和 Mac OS 根据用户登录分配 HOME 环境变量。 Mac OS 默认主目录是/Users/username
. UNIX 中,通常为/home/username
或/users/username.
ExtendScript 直接从平台值分配主目录值。
Windows,HOME
环境变量是可选的。如果已分配,则其值必须是 Windows 路径名或引用远程服务器的路径名(例如\\myhost\mydir
)。如果HOME
未定义环境变量,则 ExtendScript 默认为用户的主目录,通常是文件夹。C:\Documents and Settings\username
[sc name=”note” ]脚本可以通过静态的、全局可用的 Folder 类属性,访问特定于平台的变量指定的文件夹;例如,appData
文件夹包含用户应用程序数据。[/sc]
卷和驱动器名称
卷或驱动器名称可以是 URI 中绝对路径的第一部分。根据平台解释这些值。
Mac OS 卷
Mac OS X 启动时,启动卷是文件系统的根目录。所有其他卷,包括远程卷,都是 /Volumes 目录的一部分。File 和 Folder 对象使用这些规则来解释路径名的第一个元素:
- 如果名称是启动卷的名称,则丢弃。
- 如果名称是卷名,则在前面加
/Volumes
。 - 否则,保持路径不变。
不支持 Mac OS 9 作为操作系统,但仍然支持使用冒号作为路径分隔符,并且对应于 URI 和 Mac OS X 路径,如下表所示。这些示例假设启动卷是MacOSX
,并且有一个已安装的卷Remote
。
URI 路径名 | Mac OS 9 路径名 | Mac OS X 路径名 |
---|---|---|
/MacOSX/目录/文件 | MacOSX:目录:文件 | /目录/文件 |
/远程/目录/文件 | 远程:目录:文件 | /卷/远程/目录/文件 |
/root/目录/文件 | 根目录:目录:文件 | /root/目录/文件 |
~/目录/文件 | /用户/jdoe/目录/文件 |
Windows 驱动器
在 Windows 上,卷名对应于驱动器号。URI 路径/c/temp/file/span>
通常会转换为 Windows 路径C:\temp\file
。
如果存在名称与路径第一部分匹配的驱动器,则该部分始终被解释为该驱动器。根目录中可能有与驱动器同名的文件夹;例如C:\C
。以 /c 开头的路径始终指向driveC:
,因此在这种情况下,要按名称访问文件夹,必须同时使用驱动器名称和文件夹名称,例如/c/c
for C:\C
。
如果当前驱动器包含与另一个驱动器号同名的根文件夹,则该名称被视为文件夹。也就是说,如果存在文件夹D:\C
,并且当前驱动器是D:
,则 URI 路径 /c/temp/file
将转换为 Windows 路径D:\c\temp\file
。在这种情况下,要访问 drive C
,您必须使用 Windows 路径名称约定。
要访问远程卷,请使用格式为 的统一命名约定 (UNC) 路径名 //servername/sharename
。这些路径名是可移植的,因为 Max OS X 和 UNIX 都忽略多个斜杠字符。请注意,在 Windows 上,UNC 名称不适用于本地卷。假设当前驱动器是D:
以下示例:
URI 路径名 | Windows 路径名 |
---|---|
/c/目录/文件 | c:目录文件 |
/远程/目录/文件 | D:远程目录文件 |
/root/目录/文件 | D:根目录文件 |
~/目录/文件 | C:Documents and Settingsjdoedirfile |
别名 (翻译到这
当您访问别名时,操作被透明地转发到真实文件。唯一影响别名的操作是调用rename
和remove
,以及设置属性readonly
和hidden
。当 File 对象表示别名时,该alias
对象的属性返回 true,该resolve
方法返回别名目标的 File 或 Folder 对象。
在 Windows 上,所有文件系统别名(称为快捷方式)都是名称以扩展名结尾的实际文件 .lnk
。切勿直接使用此扩展程序;File 和 Folder 对象在没有它的情况下工作。
例如,假设文件/folder1/some.txt
夹中有文件的快捷方式/folder2
。快捷方式文件的完整 Windows 文件名是`folder2some.txt.lnk
`。
要从 File 对象访问快捷方式,请指定 path /folder2/some.txt
。调用该 File 对象的 open 方法会打开链接的文件(在 中/folder1
)。调用 File 对象的rename
方法会重命名快捷方式文件本身(保持.lnk
扩展名不变)。
但是,Windows 允许文件及其快捷方式驻留在同一文件夹中。在这种情况下,File 对象总是访问原始文件。当快捷方式与其链接文件位于同一文件夹中时,您无法创建 File 对象来访问快捷方式。
脚本可以通过为磁盘上尚不存在的文件创建 File 对象并使用其 createAlias 方法指定别名的目标来创建文件别名。
便携性问题
如果您的应用程序将在多个平台上运行,请使用相对路径名,或尝试从主目录中生成路径名。如果这不可能,请使用 Mac OS X 和 UNIX 别名,并将文件存储在 Windows 计算机的远程计算机上,以便您可以使用 UNC 名称。
例如,假设您使用 UNIX 机器 myServer 进行数据存储。如果您在 的根目录中设置别名共享myServer
,并且如果您在指向相同数据位置的共享处设置 Windows 可访问的共享,则路径名将//myServer/share/file
适用于所有三个平台。
Unicode 输入/输出
在进行文件 I/O 时,Adobe 应用程序将 8 位字符编码转换为 Unicode。默认情况下,此转换过程假定使用系统编码(Windows 上的代码页 1252 或 Mac OS 上的 Mac Roman)。encoding
File 对象的属性返回当前编码。您可以将 encoding 属性设置为所需编码的名称。File 对象在操作系统中寻找相应的编码器以用于后续 I/O。这个名字是用来描述的HTML文件,如编码标准的互联网品牌之一ASCII
,X-SJIS
或ISO-8859-1
。有关完整列表,请参阅文件和文件夹支持的编码名称。
BINARY
为二进制 I/O 提供了一个特殊的编码器。此编码器只是将它找到的每个 8 位字符扩展为 0 到 255 之间的 Unicode 字符。当使用此编码器写入二进制文件时,编码器会写入 Unicode 字符的低 8 位。例如,要写入 Unicode 字符1000
,即 0x3E8
,编码器实际上会写入字符 232 ( 0xE8
)。
一些常见文件格式(UCS-2、UCS-4、UTF-8、UTF-16)的数据以特殊的字节顺序标记 (BOM) 字符 ( \uFEFF
)开头。该File.open
方法读取文件的几个字节以查找此字符。如果找到,则自动设置相应的编码并跳过该字符。如果文件开头没有 BOM 字符,则 open() 读取文件的前 2 KB 并检查数据是否可能是有效的 UTF-8 编码数据,如果是,则将编码设置为 UTF-8。
要以 UTF-16 格式编写 16 位 Unicode 文件,请使用编码 UCS-2。此编码使用主机平台支持的任何字节顺序格式。
使用 UTF-8 编码或 16 位 Unicode 时,始终将 BOM 字符写入"\uFEFF"
文件的第一个字符。
文件错误处理
每个对象都有一个error
属性。如果访问属性或调用方法导致错误,则此属性包含描述错误类型的消息。成功时,该属性包含空字符串。您可以设置该属性,但设置它只会导致错误消息被清除。如果文件已打开,则为该属性分配任意值也会重置其错误标志。
有关受支持的错误消息的完整列表,请参阅文件访问错误消息。