TCL文件访问

目录

文件名

基本文件输入输出命令

随机文件访问

当前工作目录

文件操作和获取文件信息


文件名

TCL 提供了丰富的文件操作的命令。通过这些命令你可以对文件名进行操作(查找匹配某一模式 的文件)、以顺序或随机方式读写文件、检索系统保留的文件信息(如最后访问时间)。

CL 中文件名和我们熟悉的 windows 表示文件的方法有一些区别:在表示文件的目录结构时它 使用'/',而不是'\',这和 TCL 最初是在 UNIX 下实现有关。比如 C 盘 tcl 目录下的文件 sample.tcl 在 TCL 中这样表示:C:/tcl/sample.tcl。

基本文件输入输出命令

这个名为 tgrep 的过程,可以说明 TCL 文件 I/O 的基本特点:

proc tgrep { pattern filename} {

set f [open $filename r]

while { [gets $f line ] } {

if {[regexp $pattern $line]} {

puts stdout $line

}

}

close $f

}

以上过程非常象 UNIX 的 grep 命令, 你可以用两个参数调用它,一个是模式,另一个是文件 名,tgrep 将打印出文件中所有匹配该模式的行。

下面介绍上述过程中用到的几个基本的文件输入输出命令。

open name ?access?

open 命令 以 access 方式打开文件 name。返回供其他命令(gets,close 等)使用的文件标识。 如果 name 的第一个字符是“|”,管道命令被触发,而不是打开文件。

文件的打开方式和我们熟悉的 C 语言类似,有以下方式:

r 只读方式打开。文件必须已经存在。这是默认方式。

r+ 读写方式打开,文件必须已经存在。

w 只写方式打开文件,如果文件存在则清空文件内容,否则创建一新的空文件。

w+ 读写方式打开文件,如文件存在则清空文件内容,否则创建新的空文件。

a 只写方式打开文件,文件必须存在,并把指针指向文件尾。

a+ 只读方式打开文件,并把指针指向文件尾。如文件不存在,创建新的空文件。

open 命令返回一个字符串用于表识打开的文件。当调用别的命令(如:gets,puts,close,〕 对打开的文件进行操作时,就可以使用这个文件标识符。TCL 有三个特定的文件标识: stdin,stdout 和 stderr ,分别对应标准输入、标准输出和错误通道,任何时候你都可以使用这 三个文件标识。

gets fileId ?varName? 读 fileId 标识的文件的下一行,忽略换行符。如果命令中有 varName 就把该行赋给它,并返回该行的字符数(文件尾返回-1),如果没有 varName 参数,返回文 件的下一行作为命令结果(如果到了文件尾,就返回空字符串)。

和 gets 类似的命令是 read,不过 read 不是以行为单位的,它有两种形式:

read ?-nonewline? fileId 读并返回 fileId 标识的文件中所有剩下的字节。如果没有 nonewline 开关,则在换行符处停止。

read fileId numBytes 在 fileId 标识的文件中读并返回下一个 numbytes 字节。

puts ?-nonewline? ?fileId? string puts 命令把 string 写到 fileId 中,如果没有 nonewline 开关的话,添加换行符。fileId 默认是 stdout。命令返回值为一空字符串。

puts 命令使用 C 的标准 I/O 库的缓冲区方案,这就意味着使用 puts 产生的信息不会立即出现 在目标文件中。如果你想使数据立即出现在文件中,那你就调用 flush 命令:

flush fileId 把缓冲区内容写到 fileId 标识的文件中,命令返回值为空字符串。

flush 命令迫使缓冲区数据写到文件中。flush 直到数据被写完才返回。当文件关闭时缓冲区数 据会自动 flush。

close ?fileId? 关闭标识为 fileId 的文件,命令返回值为一空字符串。

这里特别说明的一点是,TCL 中对串口、管道、socket 等的操作和对文件的操作类似,以上对 文件的操作命令同样适用于它们。

随机文件访问

默认文件输入输出方式是连续的:即每个 gets 或 read 命令返回的是上次 gets 或 read 访问位 置后面的字节,每个 puts 命令写数据是接着上次 puts 写的位置接着写。TCL 提供了 seek,tell 和 eof 等命令使用户可以非连续访问文件。

每个打开的打开文件都有访问点,即下次读写开始的位置。文件打开时,访问点总是被设置为文 件的开头或结尾,这取决于打开文件时使用的访问模式。每次读写后访问位置按访问的字节数后 移相应的位数。

可以使用 seek 命令来改变文件的访问点:

seek fileId offset ?origin? 把 fileId 标识的文件的访问点设置为相对于 origin 偏移量为 offset 的位置。origin 可以是 start,current,end,默认是 start。命令的返回值是一空字符 串。

例如:seek fileId 2000 改变 fieleId 标识的文件访问点,以便下次读写开始于文件的第 2000 个字节。

seek的第三个参数说明偏移量从哪开始计算。第三个参数必为start,current或end中的一个。 start 是默认值:即偏移量是相对文件开始处计算。current 是偏移量从当前访问位置计算。end 是偏移量从文件尾开始计算。

tell fileId 返回 fileId 标识的文件的当前访问位置。

eof fileId 如果到达 fileId 标识的文件的末尾返回 1,否则返回 0。

当前工作目录

TCL 提供两个命令来管理当前工作目录:pwd 和 Cd。

pwd 和 UNIX 下的 pwd 命令完全一样, 没有参数,返回当前目录的完整路径。

cd 命令也和 UNIX 命令也一样,使用一个参数,可以把工作目录改变为参数提供的目录。如果 cd 没使用参数,UNIX 下,会把工作目录变为启动 TCL 脚本的用户的工作目录,WINDOWS 下会把工作目录变为 windows 操作系统的安装目录所在的盘的根目录(如:C:/)。值得注意的 是,提供给 cd 的参数中路径中的应该用'/'而不是'\'。如 cd C:/TCL/lib。这是 UNIX 的风格。

文件操作和获取文件信息

TCL 提供了两个命令进行文件名操作:glob 和 file,用来操作文件或获取文件信息。

glob 命令采用一种或多种模式作为参数,并返回匹配这个(些)模式的所有文件的列表,其语 法为:

glob ?switches? pattern ?pattern ...?

其中 switches 可以取下面的值:

-nocomplain :允许返回一个空串,没有-nocomplain 时,如果结果是空的,就返回错误。

-- :表示 switches 结束,即后面以'-'开头的参数将不作为 switches。

glob 命令的模式采用 string match 命令(见 8.5.7 节)的匹配规则。例如:

%glob *.c *.h

main.c hash.c hash.h

返回当前目录中所有.c 或.h 的文件名。 glob 还允许模式中包含' 括在花括号中间以逗号分开 的多种选择',例如 :

%glob {{src,backup}/*.[ch]}

src/main.c src/hash.c src/hash.h backup/hash.c

下面的命令和上面的命令等价:

glob {src/*.[ch]} {backup/*.[ch]}

注意:这些例子中模式周围的花括号是必须的,可以防止命令置换。在调用 glob 命令对应的 C 过程前这些括号会被 TCL 解释器去掉。

如果 glob 的模式以一斜线结束,那将只匹配目录名。例如:

glob */

只返回当前目录的所有子目录。

如果 glob 返回的文件名列表为空,通常会产生一个错误。但是 glob 的在样式参数之前的第一 个参数是"-nocomplain"的话,这时即使结果为空,glob 也不会产生错误。

对文件名操作的第二个命令是 file。file 是有许多选项的常用命令,可以用来进行文件操作也 可以检索文件信息。这节讨论与名字相关的选项,下一节描述其他选项。使用 file 命令时,我们 会发现其中有很明显的 UNIX 痕迹。

file atime name 返回一个十进制的字符串,表示文件 name 最后被访问的时间。时间是以 秒为单位从 1970 年 1 月 1 日 12:00AM 开始计算。如果文件 name 不存在或查询不到访问 时间就返回错误。例:

% file atime license.txt

975945600

file copy ?-force? ?--? source target file copy ?-force? ?--? source ?source ...? targetDir

这个命令把 source 中指明的文件或目录递归的拷贝到目的地址 targetDir,只有当存在-force 选项时,已经存在的文件才会被覆盖。试图覆盖一个非空的目录或以一个文件覆盖一个目录或以 一个目录覆盖一个文件都会导致错误。--的含义和前面所说的一样。

file delete ?-force? ?--? pathname ?pathname ... ? 这个命令删除 pathname 指定的 文件或目录,当指定了-force 时,非空的目录也会被删除。即使没有指定-force,只读文件也 会被删除。删除一个不存在的文件不会引发错误。

file dirname name 返回 name 中最后一个“/”前的所有字符;如果 name 不包含“/”,返 回“.”;如果 name 中最后一个“/”是第 name 的第一个字符,返回“/”。

file executable name 如果 name 对当前用户是可以执行的,就返回 1,否则返回 0。

file exists name 如果 name 存在于当前用户拥有搜索权限的目录下返回 1,否则返回 0。

file extension name 返回 name 中最后的“.”以后(包括这个小数点)的所有字符。如果 name 中没有“.”或最后斜线后没有“.”返回空字符。

file isdirectory name 如果 name 是目录返回 1,否则返回 0。

file isfile name 如果 name 是文件返回 1,否则返回 0。

file lstat name arrayName 除了利用 lstat 内核调用代理 stat 内核调用之外,和 file stat 命令一样,这意味着如果 name 是一个符号连接,那么这个命令返回的是这个符号连接的信息 而不是这个符号连接指向的文件的信息。对于不支持符号连接的操作系统,这个命令和和 file stat 命令一样。

file mkdir dir ?dir ...? 这个命令和 UNIX 的 mkdir 命令类似,创建 dir 中指明的目录。如 果 dir 已经存在,这个命令不作任何事情,也不返回错误。不过如果试图用一个目录覆盖已经存 在的一个文件会导致错误。这个命令顺序处理各个参数,如果发生错误的话,马上退出。

file mtime name 返回十进制的字符串,表示文件 name 最后被修改的时间。时间是以秒为 单位从 1970 年 1 月 1 日 12:00AM 开始计算。

file owned name 如果 name 被当前用户拥有,返回 1,否则返回 0。

file readable name 如果当前用户可对 name 进行读操作,返回 1,否则返回 0。

file readlink name 返回 name 代表的符号连接所指向的文件。如果 name 不是符号连接 或者找不到符号连接,返回错误。在不支持符号连接的操作系统(如 windows)中选项 readlink 没有定义。

file rename ? -force? ?--? source target file rename ?-force? ?--? source ?source ...? targetDir 这个命令同时具有重命名和移动文件(夹)的功能。把 source 指定的文件或目录改名或移动到 targetDir 下。 只有当存在-force 选项时,已经存在的文件才会被覆盖。 试图覆盖一个非空的 目录或以一个文件覆盖一个目录或以一个目录覆盖一个文件都会导致错误。

file rootname name 返回 name 中最后“.”以前(不包括这个小数点)的所有字符。如果 name 中没有“.”返回 Name。

file size name 返回十进制字符串,以字节表示 name 的大小。如果文件不存在或得不到 name 的大小,返回错误。

file stat name arrayName 调用 stat 内核来访问 name,并设置 arrayName 参数来保存 stat 的返回信息。 arrayName 被当作一个数组,它将有以下元素:atime、ctime、dev、gid、 ino、mode、mtime、nlink、size、type 和 uid。除了 type 以外,其他元素都是十进制的字 符串,type 元素和 file type 命令的返回值一样。其它各个元素的含义如下:

atime 最后访问时间.

ctime 状态最后改变时间.

dev 包含文件的设备标识.

gid 文件组标识.

ino 设备中文件的序列号.

mode 文件的 mode 比特位.

mtime 最后修改时间.

nlink 到文件的连接的数目.

size 按字节表示的文件尺寸.

uid 文件所有者的标识.

这里的 atime、mtime、size 元素与前面讨论的 file 的选项有相同的值。要了解其他元素更多 的信息,就查阅 stat 系统调用的文件;每个元都直接从相应 stat 返回的结构域中得到。 文件 操作的 stat 选项提供了简单的方法使一次能获得一个文件的多条信息。这要比分多次调用 file 来获得相同的信息量要显著的快。

file tail name 返回 name 中最后一个斜线后的所有字符,如果没有斜线返回 name。

file type name 返回文件类型的字符串,返回值可能是下列中的一个: file、directory、 characterspecial、blockSpecial、fifo、link 或 socket。

file writable name

如果当前用户对 name 可进行写操作,返回 1,否则返回 0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值