程序中常有处理文件和目录的需求。如获取文件最后一次访问时间、重命名文件、复制文件、删除文件、读写文件等。
一、操纵文件和目录名
Tcl中指定文件名时遵循普通的Unix语法,如x/y/z 表示名为z的文件存储的相对路径, /top 指的是根目录下的top文件。还可以用~表示home文件夹,如 ~usr1/box 指的是用户usr1的home文件夹中的box文件。
Windows系统使用反斜线分隔目标。反斜线\ 在Tcl和其它基于C语言约定的语言中可能造成问题,因为Tcl的替换操作,需要使用\表示目录分隔符,如\apps\tcl, 或使用{\apps\tcl}。Windows的磁盘驱动器没有挂载在一个根目录下,使用盘符(如D:)来表示对应驱动器。有网络共享的时候情况会更复杂,如使用\\host\\share。
1.1 file join和file split命令
命令可以把文件名和目录以跨平台的方式适当地组合和分解开来。
set env(HOME)
file join $env(HOME) lib myfile.tcl
无论路径的原始样式如何,file join 命令返回Unix样式的路径,以/符号作为目录分隔符。
路径中的空格处理
file join c:/ {Program Files} Tcl tclsh.exe
file join c:/ Program\ Files Tcl tclsh.exe
file split 命令可以将一个文件名路径分割为它的各组成部分
% file split x/y/z
x y z
1.2 file nativename
该命令可以返回原生格式的文件名。
% file nativename ~/script/coolscript.tcl
C:\Users\Administrator\script\coolscript.tcl
1.3 file dirname
该命令移除文件名中的最后一个部分
% file dirname /a/b/c
/a/b
% file dirname test.tcl
.
1.4 file extension
该命令返回一个文件的扩展名,如没有扩展名则返回一个空字符串
% file extension src/main.c
.c
% file extension src/main
%
1.5 file rootname
该命令返回文件名中除扩展名之外的部分
% file rootname src/main.c
src/main
% file rootname main
main
1.6 file tail
该命令返回文件名的最后一个部分
% file tail /a/b/c
c
% file tail main.c
main.c
1.7 file normalize 返回独一无二的标准化路径
标准化路径指不含./ 和 …/的绝对路径。
% file normalize ~/Document/../pip
C:/Users/Administrator/pip
此外,还有其它命令,如 file pathtype等。
二、当前工作目录
Tcl中,提供的文件名称可以用绝对路径或相对路径,因此知道当前工作目录通常十分重要。tcl提供了两个命令帮助管理当前工作目录。pwd命令获取当前工作目录的完整路径。cd命令切换工作目录。
% pwd
C:/ActiveTcl/bin
% cd
% pwd
C:/Users/Administrator
三、列出目录的内容
global 命令获取一个或更多模式参数,返回与这些模式匹配的文件列表。
% glob *.tcl
t01_basic.tcl test.tcl test2.tcl vscode_tcl_config.tcl
% glob *.tcl *.txt
t01_basic.tcl test.tcl test2.tcl vscode_tcl_config.tcl a.txt
glob 命令还允许模式参数中包含逗号分隔符,在大括号中用逗号分隔多个模式为或的关系。需注意的是逗号后不能有空格。
% glob {{src, src_bak}/*.tcl}
src/main.tcl
% glob {{src,src_bak}/*.tcl}
src/main.tcl src_bak/main_bak.tcl
# 和如下多个模式一样
% glob {src/*.tcl} {src_bak/*.tcl}
src/main.tcl src_bak/main_bak.tcl
glob 模式以斜线结尾,则只匹配目录名
% glob */
src/ src_bak/
使用-type选项指定glob命令只返回特定类型的文件。-type参数可以是一个或多个下列参数组成的列表:
参数 | 含义 |
---|---|
b | 块设备 |
c | 字符设备 |
d | 目录 |
f | 无格式文件 |
l | 符号链接 |
p | 命名管道 |
s | 套接字 |
r | 读取授权 |
w | 写入授权 |
x | 执行授权 |
hidden | 隐藏文件 |
readonly | 只读授权 |
可以联合使用一个或多个这些条目,返回的文件需要与指定的至少一种文件类型,与指定的所有文件授权项相匹配
% glob -types {f r} *
a.txt t01_basic.tcl test.tcl test2.tcl vscode_tcl_config.tcl
% glob -types {f x} *
no files matched glob pattern "*"
-directory 选项,告诉glob从指定目录开始搜索
-path 选项,搜索名称以-path参数值开头的那些文件。-path 和 -directory 不能同时指定。
-tail 选项,返回文件中-directory或-path选项值后面的部分。
四、处理磁盘上的文件
Tcl 提供很多命令对磁盘上的文件进行操作,如移动、重命名、复制以及删除等。
4.1 创建目录 file mkdir
% glob */
src/ src_bak/
% file mkdir src2
% glob */
src/ src2/ src_bak/
4.2 删除文件 file delete
删除文件
# 删除文件
file delete test_copy.tcl test2_copy.tcl
删除指定模式匹配的文件列表,需先用glob命令返回指定模式匹配的文件列表,然后用Tcl参数展开语法把列表元素作为单独参数提供给file delete。
# 删除通配匹配结果
% glob *copy.tcl
{t01_basic copy.tcl} {test copy.tcl} {test2 copy.tcl}
% file delete {*}[glob *copy.tcl]
% glob *copy.tcl
no files matched glob pattern "*copy.tcl"
删除文件目录,只需要将目录作为参数。如目录内容非空,file delete会产生错误,可使用-force选项递归删除目录和其中的目录和文件,谨慎使用。
% file delete src_bak
error deleting "src_bak": directory not empty
% file delete -force src_bak
4.3 复制文件file copy
文件复制,如源文件不存在或目标文件已存在,会报错。
% file copy test.tcl test3.tcl
将多个文件复制到目标目录中
% file mkdir bak
% file copy test.tcl test3.tcl bak
4.4 重命名和移动文件file rename
该命令给一个文件或目录指定新的名称。
file rename test.tcl test_bak.tcl
4.5 文件信息命令
file 命令还提供很多用于提取文件相关信息的选项。除了stat和lstat外,这些选项有相同格式。option 指定了需要的信息,如exists、readable、size、isfile、isdirectory、type等
file option name
stat 选项提供了一种简单方法,可一次得到文件的各种信息。获取的信息存放到指定变量中,该变量可视为数组对待。
% file stat test_bak.tcl info
% puts $info(size)
1336
关键字 | 值 |
---|---|
atime | 最后一次被访问的时间 |
ctime | 最后一次改变状态的时间 |
dev | 包含文件的设备的识别符 |
gid | 文件的群组识别符 |
ino | 文件在设备中的序列号 |
mode | 文件模式位 |
mtime | 最后一次被修改的时间 |
nlink | 链接到文件的链接数量 |
size | 文件大小,单位为字节 |
uid | 拥有文件的用户标识 |
4.6 处理名称怪异的文件
Tcl用短横线开头的单词表示这是命令提供的选项。如file copy -force选项。如处理的文件名称以短横线开头,可用–把选项和参数分开。
file copy -force -- -force b.txt