TCL练习6:通过递归方法搜索文件夹并返回指定后缀文件

写这个TCL脚本的主要目的是搜索目标文件夹及其子文件夹下的所有文件,然后记录在指定的文件中。可以指定目标文件夹名称、信息记录位置和文件后缀等3种参数。

该脚本将用于Vivado的non-project编译过程,被综合和布线脚本调用。

define.tcl中定义了目标文件夹名称、信息记录位置、文件后缀类型、器件part等信息。findAllFiles.tcl脚本根据define.tcl中的参数搜索目标文件夹,当文件后缀类型参数(ext)为.hdl时,会搜索.v、.vh、.vhd、.sv等文件的路径和名称,并记录在./Tcl/code.rd中;当文件后缀类型参数为.xdc时,会搜索.xdc文件,并记录在./Tcl/cons.rd中。设计代码放置在srcs文件夹中,约束文件放置在constraints文件夹中。如果没有分类放置也可以正确识别。

set part "xcvu3p-ffvc1517-2-e"set srcsPath "../srcs"set consPath "../Constraints"set codeRec "./code.rd"set consRec "./cons.rd"set codeExt ".hdl"set consExt ".xdc" set top "Top"set synthDir "$top.synth"set synthLog "synth.log"set synthDcp "_synth.dcp"

以下是findAllFiles.tcl的内容。

source ./define.tcl set status [catch {set codeF [open $codeRec w+]} msg]if {$status} { puts $msg } proc findFiles { dir result ext } {    if {![file exists $dir] || ![file isdirectory $dir]} {        return -code error "File not exists or not a directory."    }    # 使用以下方式获得文件名称将不包含路径,在通过if {[file isfile $f]}判断时是无法索引到该文件的,所以无法进入该条件    # set files [glob -nocomplain -directory $dir/ -tails *]    set files [glob -nocomplain -directory $dir/ *]    foreach f $files {        if {[file isfile $f]} {            # 根据ext参数匹配不同后缀的文件,记录.v .vh .vhd .sv文件            if {[string match $ext $::codeExt]} {                set fExt [file extension $f]                    if {[expr {$fExt==".v"}] || [expr {$fExt==".vh"}] || [expr {$fExt==".vhd"}] || [expr {$fExt==".sv"}]} {                    # glob 返回的文件是带有路径的,除非使用-tails                    puts $f                    puts $result $f                }            } elseif {[string match $ext $::consExt]} {                # 记录xdc文件                set fExt [file extension $f]                    if {[expr {$fExt==".xdc"}]} {                    # glob 返回的文件是带有路径的,除非使用-tails                    puts $f                    puts $result $f                }            }        } elseif {[file isdirectory $f]} {            # 递归            findFiles $f $result $ext         }     }} # 在tcl脚本中完成文件的写操作后一定要close文件,否则文件中不会写入任何内容。findFiles $srcsPath $codeF $codeExtclose $codeF set status [catch {set consF [open $consRec w+]} msg]if {$status} { puts $msg }findFiles $consPath $consF $consExtclose $consF

以上代码经过测试可以找出并分类存储指定的文件类型,可搜索所有子文件夹。所有tcl文件放置于Tcl文件夹中,srcs和constraints放置在与Tcl同级的目录中。

————————————————

版权声明:本文为CSDN博主「小苍蝇别闹」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/yinyeyy/article/details/115666182

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章