Tcl语言:file命令的使用方式

相关阅读

Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm=1001.2014.3001.5482


file命令是Tcl中用于处理文件和目录的重要命令。它本身不是一个具体的文件操作,而是需要配合子命令使用,例如file exists用于判断文件是否存在,file isfile用于判断是否为普通文件,file mkdir用于创建目录。 Tcl中的file命令采用"主命令+子命令+参数"的形式:

复制代码
file subcommand arg arg ...

文件测试

exists

file exists用于判断指定路径是否存在。该路径可以是普通文件,也可以是目录。

复制代码
if {[file exists "test.txt"]} {
    puts "文件或目录存在"
} else {
    puts "文件或目录不存在"
}

需要注意的是,file exists只判断路径是否存在,并不区分该路径是普通文件还是目录。

isfile

file isfile用于判断指定路径是否为普通文件。如果路径不存在,或者路径存在但不是普通文件,则返回0。

复制代码
if {[file isfile "test.txt"]} {
    puts "是普通文件"
} else {
    puts "不是普通文件"
}

如果只想判断一个普通文件是否存在,通常可以使用file isfile,而不是file exists。

isdirectory

file isdirectory用于判断指定路径是否为目录。

复制代码
if {[file isdirectory "mydir"]} {
    puts "是目录"
} else {
    puts "不是目录"
}

readable

file readable用于判断指定文件或目录是否具有可读权限。

复制代码
if {[file readable "test.txt"]} {
    puts "文件或目录可读"
} else {
    puts "文件或目录不可读"
}

writable

file writable用于判断指定文件或目录是否具有可写权限。

复制代码
if {[file writable "test.txt"]} {
    puts "文件或目录可写"
} else {
    puts "文件或目录不可写"
}

executable

file executable用于判断指定文件是否可执行。

复制代码
if {[file executable "run.sh"]} {
    puts "文件可执行"
} else {
    puts "文件不可执行"
}

路径处理

dirname

file dirname用于获取路径中的目录部分。

复制代码
set path "/home/user/test.txt"
puts [file dirname $path]
/home/user

set path "./user/test.txt"
puts [file dirname $path]
./user

tail

file tail用于获取路径中的最后一部分,通常也就是文件名。

复制代码
set path "/home/user/test.txt"
puts [file tail $path]
test.txt

extension

file extension用于获取文件扩展名。

复制代码
set filename "top.v"
puts [file extension $filename]
.v

rootname

file rootname用于去掉文件路径中的最后一个扩展名。

复制代码
set filename "top.v"
puts [file rootname $filename]
top

对于带路径的文件同样适用。

复制代码
set path "./src/top.v"
puts [file rootname $path]
./src/top

join

file join用于拼接路径。相比直接使用/连接路径,file join更加规范,也更适合跨平台脚本。

复制代码
set dir "./src"
set filename "top.v"
set path [file join $dir $filename]
puts $path
./src/top.v

split

file split用于将路径拆分成列表。

复制代码
set path "/home/user/test.txt"
puts [file split $path]
/ home user test.txt

set path "./user/test.txt"
puts [file split $path]
. user test.txt

normalize

file normalize用于将路径转换为绝对路径,会处理.、..等路径成分。

复制代码
set path "./src/../test.txt"
puts [file normalize $path]
/home/user/project/test.txt

文件信息

size

file size用于获取文件大小,单位为字节。

复制代码
set filename "test.txt"

if {[file exists $filename]} {
    puts "文件大小为:[file size $filename] 字节"
}

需要注意的是,如果文件不存在,直接使用file size会报错。因此通常先用file exists或file isfile进行判断。

复制代码
set filename "test.txt"

if {[file isfile $filename]} {
    puts "文件大小为:[file size $filename] 字节"
} else {
    puts "文件不存在或不是普通文件"
}

type

file type用于获取路径对应的文件类型。

复制代码
set filename "test.txt"

if {[file exists $filename]} {
    puts [file type $filename]
}

常见返回结果包括:

复制代码
file
directory
link

mtime

file mtime用于获取文件最后一次修改时间,返回值通常是一个时间戳。

复制代码
set filename "test.txt"

if {[file exists $filename]} {
    puts [file mtime $filename]
}

如果希望将时间戳转换为可读格式,可以配合clock format命令。

复制代码
set filename "test.txt"

if {[file exists $filename]} {
    set t [file mtime $filename]
    puts [clock format $t -format "%Y-%m-%d %H:%M:%S"]
}

atime

file atime用于获取文件最后一次访问时间。

复制代码
set filename "test.txt"

if {[file exists $filename]} {
    set t [file atime $filename]
    puts [clock format $t -format "%Y-%m-%d %H:%M:%S"]
}

文件和目录操作

mkdir

file mkdir用于创建目录。如果中间目录不存在,也会一起创建。

复制代码
set dir "result/report"

if {![file isdirectory $dir]} {
    file mkdir $dir
}

delete

file delete用于删除文件或目录。

复制代码
file delete "test.txt"

如果要删除非空目录,可以使用-force选项。

复制代码
file delete -force "output"

使用-force时需要谨慎,因为它会递归删除目录中的内容。

复制代码
set dir "output"

if {[file exists $dir]} {
    file delete -force $dir
}

copy

file copy用于复制文件或目录。

复制代码
file copy "a.txt" "b.txt"

如果目标文件已经存在,默认会报错。可以使用-force选项强制覆盖。

复制代码
file copy -force "a.txt" "b.txt"

set src "report.txt"
set dst "backup/report.txt"

if {[file isfile $src]} {
    file mkdir [file dirname $dst]
    file copy -force $src $dst
}

rename

file rename可以用于重命名文件,也可以用于移动文件。

复制代码
file rename "old.txt" "new.txt"

移动文件:

复制代码
file rename "test.txt" "backup/test.txt"

如果目标文件已经存在,默认会报错。可以使用-force选项覆盖。

复制代码
file rename -force "test.txt" "backup/test.txt"