相关阅读
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"