代码之家  ›  专栏  ›  技术社区  ›  DEfusion

Ruby在复制文件时显示进度

  •  8
  • DEfusion  · 技术社区  · 15 年前

    我希望能够在使用Ruby(当前使用FileUtils.cp)复制文件时显示文件复制操作的进度。我已经尝试设置 verbose true 但这似乎只是向我展示了发出的复制命令。

    目前我正在从命令行运行这个脚本,所以理想情况下,我希望能够像SCP复制文件时那样演示一些内容,但只要我能看到进度,我就不会对演示过于操心。

    4 回复  |  直到 15 年前
        1
  •  14
  •   Dorian Malcolm    7 年前

    由于我没有足够的代表来编辑答案,这里是我基于pisswillis答案的版本,我发现了一个 progress bar gem 我在我的例子中也用到了这个。我已经对此进行了测试,到目前为止效果还不错,但需要进行一些清理:

    require 'rubygems'
    require 'progressbar'
    
    in_name     = "src_file.txt"
    out_name    = "dest_file.txt"
    
    in_file     = File.new(in_name, "r")
    out_file    = File.new(out_name, "w")
    
    in_size     = File.size(in_name)
    # Edit: float division.
    batch_bytes = ( in_size / 100.0 ).ceil
    total       = 0
    p_bar       = ProgressBar.new('Copying', 100)
    
    buffer      = in_file.sysread(batch_bytes)
    while total < in_size do
     out_file.syswrite(buffer)
     p_bar.inc
     total += batch_bytes
     if (in_size - total) < batch_bytes
       batch_bytes = (in_size - total)
     end
     buffer = in_file.sysread(batch_bytes)
    end
    p_bar.finish
    
        2
  •  7
  •   pisswillis    15 年前

    使用IO.syswrite、IO.sysread滚动您自己的。

    首先,决定进度条的长度(以字符为单位)。。那么这个伪代码应该可以做到这一点(未经测试):

    infile = File.new("source", "r")
    outfile = File.new("target", "w")
    
    no_of_bytes = infile.length / PROGRESS_BAR_LENGTH
    
    buffer = infile.sysread(no_of_bytes)
    while buffer do
     outfile = syswrite(buffer)
     update_progress_bar()
     buffer = infile.sysread(no_of_bytes)
    end
    

    其中update_progress_bar()是将进度条增加一个字符的方法。

        3
  •  6
  •   rampion    15 年前

    或者,如果你喜欢的进度条是scp,你也可以直接使用它:

    def copy(source, dest)
      `scp #{source} localhost:#{dest}`
    end
    

    您必须确保系统调用的源和目标名称已正确转义。这个 localhost:

        4
  •  0
  •   Andy Ali    10 年前

    在Windows下,不要忘记为二进制文件添加“b”,因此对于二进制文件,“w”和“r”应分别为“wb”和“rb”。

    in_file     = File.new(in_name, "rb")
    out_file    = File.new(out_name, "wb")