分类:
2011-03-21 10:27:31
TCL
提供了两个命令进行文件名操作:
glob
和
file
,用来操作文件或获取文件信息。
File
提供如下
3
中功能:
解析文件名的字符串处理功能:
dirname ........ Returns directory portion of path
extension ........ Returns file name extension
join ........ Join directories and the file name to one string
nativename ....... Returns the native name of the file/directory
rootname ....... Returns file name without extension
split ........ Split the string into directory and file names
tail .................... Returns filename without directory
关于目录的信息
:
atime ................ Returns time of last access
executable ..... Returns 1 if file is executable by user
exists ................ Returns 1 if file exists
isdirectory ...... Returns 1 if entry is a directory
isfile .................. Returns 1 if entry is a regular file
lstat ................... Returns array of file status information
mtime ............... Returns time of last data modification
owned ................ Returns 1 if file is owned by user
readable ............ Returns 1 if file is readable by user
readlink ............. Returns name of file pointed to by a symbolic link
size ..................... Returns file size in bytes
stat ..................... Returns array of file status information
type .................... Returns type of file
writable ............ Returns 1 if file is writeable by user
处理文件和目录
:
copy ................ Copy a file or a directory
delete ................ Delete a file or a directory
mkdir ................ Create a new directory
rename ................ Rename or move a file or directory
比如连接文件:
set upfile [file join ".." "myfile.out"]
# upfile will have the value "../myfile.out"
适应操作系统的连接符:
#
# On Windows the name becomes "..\myfile.out"
#
set newname [file nativename [file join ".." "myfile.out"]]
比如列出当前目录的所有exe文件:
set tclfiles [glob *.exe]
puts "Name - date of last modification"
foreach f $tclfiles {
puts "$f - [clock format [file mtime $f] -format %x]"
}
执行结果:
Name - date of last modification
notepad++.exe - 01/29/2011
uninstall.exe - 03/14/2011
上面的clock命令用于把file mtime的结果转换为简单字符串,比如"12/22/04"
glob
命令采用一种或多种模式作为参数,并返回匹配这个(些)模式的所有文件的列表,其语法为:
glob
?switches? pattern ?patternN?
其中
switches
可以取下面的值:
-nocomplain
:允许返回一个空串,没有
-nocomplain
时,如果结果是空的,就返回错误。
-types
typeList
选择返回的文件
/
目录类型。
--
:表示
switches
结束,即后面以
'-'
开头的参数将不作为
switches
。
匹配规则:
{a,b,...}
匹配
a,b
开头的点号匹配点号,其他的匹配单个字符。
/
必须精确匹配
~/
表示用户目录,
~loginid
也类似
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
命令一样。
varName
是一个数组,和
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?
name
target
这个命令同时具有重命名和移动文件
(
夹
)
的功能。把
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
。
实例:
#
#
Report all the files and subdirectories in the current directory
# For
files: show the size
# For
directories: show that they _are_ directories
#
set
dirs [glob -nocomplain -type d *]
if {
[llength $dirs] > 0 } {
puts "Directories:"
foreach d [lsort $dirs] {
puts " $d"
}
} else
{
puts "(no subdirectories)"
}
set
files [glob -nocomplain -type f *]
if {
[llength $files] > 0 } {
puts "Files:"
foreach f [lsort $files] {
puts " [file size $f] - $f"
}
} else
{
puts "(no files)"
}
执行结果:
Directories:
localization
plugins
themes
updater
user.manual
Files:
296448 - NppShell_04.dll
535040 - SciLexer.dll
6114 - change.log
4539 - config.model.xml
91509 - langs.model.xml
14971 - license.txt
1523712 - notepad++.exe
1543 - readme.txt
21 - report.out
2108 - shortcuts.xml
95613 - stylers.model.xml
249178 - uninstall.exe