Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19911600
  • 博文数量: 679
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 9308
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 10:51
文章分类

全部博文(679)

文章存档

2012年(5)

2011年(38)

2010年(86)

2009年(145)

2008年(170)

2007年(165)

2006年(89)

分类:

2011-03-21 10:27:31

使用fileglob获取文件信息

#承接软件自动化实施与培训等gtalk: ouyangchongwu#gmail.com qq 37391319
#python qq group: 深圳自动化测试python群:113938272
#武冈深圳qq群:66250781

TCL提供了两个命令进行文件名操作:globfile,用来操作文件或获取文件信息。

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也不会产生错误。

 

对文件名操作的第二个命令是filefile是有许多选项的常用命令,可以用来进行文件操作也可以检索文件信息。这节讨论与名字相关的选项,下一节描述其他选项。使用file命令时,我们会发现其中有很明显的UNIX痕迹。

file   atime    name        返回一个十进制的字符串,表示文件name最后被访问的时间。时间是以秒为单位从1970111200AM开始计算。如果文件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 ...?    这个命令和UNIXmkdir命令类似,创建dir中指明的目录。如果dir已经存在,这个命令不作任何事情,也不返回错误。不过如果试图用一个目录覆盖已经存在的一个文件会导致错误。这个命令顺序处理各个参数,如果发生错误的话,马上退出。

 

file  mtime  name            返回十进制的字符串,表示文件name最后被修改的时间。时间是以秒为单位从1970111200AM开始计算。

 

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被当作一个数组,它将有以下元素:atimectimedevgidinomodemtimenlinksizetypeuid。除了type以外,其他元素都是十进制的字符串,type元素和file type命令的返回值一样。其它各个元素的含义如下:

         atime       最后访问时间.

         ctime       状态最后改变时间.

         dev         包含文件的设备标识.

         gid         文件组标识.

         ino         设备中文件的序列号.

         mode        文件的mode比特位.

         mtime       最后修改时间.

         nlink       到文件的连接的数目.

         size        按字节表示的文件尺寸.

         uid         文件所有者的标识.

这里的atimemtimesize元素与前面讨论的file的选项有相同的值。要了解其他元素更多的信息,就查阅stat系统调用的文件;每个元都直接从相应stat返回的结构域中得到。 文件操作的stat选项提供了简单的方法使一次能获得一个文件的多条信息。这要比分多次调用file来获得相同的信息量要显著的快。

 

file   tail   name         返回name中最后一个斜线后的所有字符,如果没有斜线返回name

 

file  type  name      返回文件类型的字符串,返回值可能是下列中的一个:  filedirectorycharacterspecialblockSpecialfifolinksocket

 

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

阅读(12900) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~