【问题标题】:Tcl - Recursive walking and FTP uploadTcl - 递归行走和 FTP 上传
【发布时间】:2011-10-13 17:06:01
【问题描述】:

如何递归遍历本地文件夹,以便将其中的所有内容上传到所需的 ftp 文件夹?这是我到目前为止所拥有的:

package require ftp

set host **
set user **
set pass **
set ftpdirectory **
set localdirectory **

proc upload {host user pass dir fileList} {
      set handle [::ftp::Open $host $user $pass]

     ftpGoToDir $handle $dir
      # some counters for our feedback string
      set j 1
      set k [llength $fileList]

      foreach i $fileList {
        upload:status "uploading ($j/$k) $i"
        ::ftp::Put $handle $i
        incr j
}

  ::ftp::Close $handle
 }

 #---------------
 # feedback
 #---------------
 proc upload:status {msg} {
  puts $msg
 }

 #---------------
 # go to directory in server
 #---------------

 proc ftpGoToDir {handle path} {
     ::ftp::Cd $handle /
     foreach dir [file split $path] {
     if {![::ftp::Cd $handle $dir]} {
         ::ftp::MkDir $handle $dir
         ::ftp::Cd $handle $dir
     }
     }
 }

proc watchDirChange {dir intv {script {}} {lastMTime {}}} {
      set nowMTime [file mtime $dir]
      if [string eq $lastMTime ""] {
         set lastMTime $nowMTime
      } elseif {$nowMTime != $lastMTime} {
         # synchronous execution, so no other after event may fire in between
         catch {uplevel #0 $script}
         set lastMTime $nowMTime
      }
      after $intv [list watchDirChange $dir $intv $script $lastMTime]
 }

watchDirChange $localdirectory 5000 {
    puts stdout {Directory $localdirectory changed!}
    upload $host $user $pass $ftpdirectory [glob -directory $localdirectory -nocomplain *]
}

 vwait forever

提前致谢:)

【问题讨论】:

  • 如果要扩展变量,这里需要双引号而不是大括号:puts stdout {Directory $localdirectory changed!}
  • 每 5 秒上传一次全部内容有点极端,不是吗? after 间隔以毫秒为单位。本地文件发送后是否要删除?
  • @glennjackman jackman 谢谢,我昨晚发现了 Tcl,仍然理解逻辑。不,我想保留本地文件。

标签: recursion ftp tcl


【解决方案1】:

您已经在使用ftp 包,这意味着您已经安装了 tcllib。好的。这意味着您也拥有fileutil 包,并且可以这样做:

package require fileutil

# How to do the testing; I'm assuming you only want to upload real files
proc isFile f {
    return [file isfile $f]
}
set filesToUpload [fileutil::find $dirToSearchFrom isFile]

fileutil::find 命令与递归的glob 非常相似,只是您将过滤器指定为命令而不是通过选项。

不过,您可能更喜欢使用rsync;它不是一个 Tcl 命令,但它非常好,它会最大限度地减少实际传输的数据量。

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2017-02-27
    • 2019-07-16
    • 2021-12-23
    • 2018-04-10
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多