TCL文件访问

news/2024/11/8 9:00:09/

目录

文件名

基本文件输入输出命令

随机文件访问

当前工作目录

文件操作和获取文件信息


文件名

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。


http://www.ppmy.cn/news/74377.html

相关文章

TensorFlow 1.x学习(系列二 :4):自实现线性回归

目录 线性回归基本介绍常用的op自实现线性回归预测tensorflow 变量作用域 线性回归基本介绍 线性回归: w 1 ∗ x 1 w 2 ∗ x 2 w 3 ∗ x 3 . . . w n ∗ x n b i a s w_1 * x_1 w_2 * x_2 w_3 * x_3 ... w_n * x_n bias w1​∗x1​w2​∗x2​w3​∗x3​..…

倒挂的解决方案你现在是一位计算机专家,来聊一聊:“美国的火星探测器Mars Path-finder 就是因为优先级倒挂而出现故障的故事”

目录 倒挂的解决方案 你现在是一位计算机专家,来聊一聊:“美国的火星探测器Mars Path-finder 就是因为优先级倒挂而出现故障的故事” ●使用中断禁止 具体证明请参阅Liu和Kayland于1973年发表的论文。 ● 因时序或外部中断或进程挂起而导致操作系统获…

加密与解密 调试篇 动态调试技术

目录 OllyDbg调试器的使用 CPU窗口 反汇编窗口 信息面板 数据面板 寄存器面板 栈面板 OllyDbg的配置 界面设置 调试设置 加载符号文件 基本操作 调试 单步跟踪 如果我们想直接运行 如果想重新运行 设置断点 下面对这个程序进行完整的调试分析 方法1 猜函数 方法…

第七章 面向对象编程(基础)

一、类与对象 1. 类和对象的区别和联系 (1)类是抽象的,概念的,代表一类事物,比如人类、猫类... 即它是数据类型。 (2)对象是具体的,实际的,代表一个具体事物&#xff0c…

Linux systemd

这里写目录标题 一:配置文件内容二:配置文件位置三:开机启动配置四:systemctl使用 一:配置文件内容 systemd服务配置文件存放在/usr/lib/systemd目录下,有系统system和用户user之分,需要开机不登录就能运行的程序,放在/usr/lib/systemd/syst…

排序问题之归并排序

题目描述 给定一个长度为 N 的数组 A,请你先从小到大输出它的每个元素,再从大到小输出它的每个元素。 输入描述 第一行包含一个整数 N。 第二行包含 N 个整数 1,...,a1​,...,an​,表示数组 A 的元素。 1≤N≤5105,−109≤ai≤109 输出…

Git常用命令fetch和pull和push

Git常用命令pull和push 1、fetch 从远程获取代码库。 # 会将所有远程分支都拉到本地 # 并不会合并代码 $ git fetch# 下载远程仓库的所有变动 $ git fetch remote $ git fetch origin# 指定拉取远程remote的branch分支到本地 $ git fetch remote branch $ git fetch origin …

Kafka 和 RocketMQ 在文件布局上的异同

Kafka 中文件的布局是以 Topic/partition 为主 ,每一个分区拥有一个物理文件夹,Kafka 在分区级别实现文件顺序写。如果一个 Kafka 集群中有成百上千个主题,每一个主题又有上百个分区,消息在高并发写入时,IO 操作就会显…