【问题标题】:Ruby Net::FTP Progress BarRuby Net::FTP 进度条
【发布时间】:2010-12-20 03:42:37
【问题描述】:

有谁知道在下载文件时从 ruby​​ 的 Net::FTP 库获取状态更新的方法?我正在尝试实现一个 Web 界面,在从远程 ftp 服务器下载文件时显示剩余百分比的进度条。

【问题讨论】:

    标签: ruby ftp


    【解决方案1】:

    供将来参考 - 我偶然发现了一个解决方案:

    filesize = ftp.size(filename)
    transferred = 0
    p "Beginning download, file size: #{filesize}"
    ftp.getbinaryfile(filename, "#{SOURCE_IMPORT_DIRECTORY}/#{filename}", 1024) { |data|
      transferred += data.size
      percent_finished = ((transferred).to_f/filesize.to_f)*100
      p "#{percent_finished.round}% complete"
    }
    ftp.close
    

    【讨论】:

    • 这是一个旧线程,但是,您可以奖励自己的答案。干得好。
    【解决方案2】:

    我扩展了@smnirven 和@theoretick 给出的答案,创建了一个固定大小的进度条,在完成时会填满,这样您就可以直观地了解进度的完成程度:

    def getprogress(ftp,file,local_path)
      transferred = 0
      filesize = ftp.size(file)
      ftp.get(file, local_path, 1024) do |data|
        transferred += data.size
        percent = ((transferred.to_f/filesize.to_f)*100).to_i
        finished = ((transferred.to_f/filesize.to_f)*30).to_i
        not_finished = 30 - finished
        print "\r"
        print "#{"%3i" % percent}%"
        print "["
        finished.downto(1) { |n| print "=" }
        print ">"
        not_finished.downto(1) { |n| print " " }
        print "]"
      end
      print "\n"
    end
    

    输出:

    Executing gather for: ruby
    Going to public ftp - ftp.ruby-lang.org
    File list for /pub/ruby/2.0/:
    ruby-2.0.0-p647.tar.gz
    
    Downloading:    ruby-2.0.0-p647.tar.gz
    100%[==============================>]
    

    此示例的关键是打印“\r”,以便重写该行。

    【讨论】:

      【解决方案3】:

      我以 @smnirven 的出色方法为基础,通过 100 点的进度来减少噪音:

      filesize = ftp.size(filename)
      transferred = 0
      notified = false
      
      ftp.getbinaryfile(filename, full_local_path, 1024) do |data|
        transferred += data.size
        percent_finished = (((transferred).to_f/filesize.to_f)*100)
        if percent_finished.to_s.include?('.0')
          print "."  if notified == false
          notified = true
        else
          notified = false
        end
      end
      ftp.close
      

      输出:

      [progress] Downloading CBSA boundaries...
      ..........................................................................
      ..........................
      [progress] Finished!
      

      【讨论】:

        【解决方案4】:

        只是对代码进行了小幅更新,以使输出更清晰。

        filesize = ftp.size(FILENAME)
        transferred = 0
        percent_finished = -9999
        
        ftp.gettextfile(FILENAME, File.basename(FILENAME)) { |data|
          transferred += data.size
        
          temp = (((transferred).to_f/filesize.to_f)*100).round
        
          if percent_finished < temp
            percent_finished = temp
            STDOUT.write "\r Download progress: #{percent_finished.round}% completed"
          end
        }
        ftp.close
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-17
          • 2012-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-16
          • 2013-02-24
          相关资源
          最近更新 更多