Tcl 访问文件

程序中常有处理文件和目录的需求。如获取文件最后一次访问时间、重命名文件、复制文件、删除文件、读写文件等。

一、操纵文件和目录名

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值