Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby在复制文件时显示进度_Ruby_File_File Io_Copy_Progress - Fatal编程技术网

Ruby在复制文件时显示进度

Ruby在复制文件时显示进度,ruby,file,file-io,copy,progress,Ruby,File,File Io,Copy,Progress,我希望能够在使用Ruby(当前使用FileUtils.cp)复制文件时显示文件复制操作的进度。我尝试将verbose选项设置为true,但这似乎只是显示了发出的复制命令 目前我正在从命令行运行此脚本,因此理想情况下,我希望能够在复制文件时像SCP那样演示文稿,但只要我能看到进度,我就不会对演示文稿太在意。使用IO.syswrite、IO.sysread进行自己的演示 首先,决定进度条的长度(以字符为单位)。。那么这个伪代码应该可以做到这一点(未经测试): 其中update_progress_ba

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


目前我正在从命令行运行此脚本,因此理想情况下,我希望能够在复制文件时像SCP那样演示文稿,但只要我能看到进度,我就不会对演示文稿太在意。

使用IO.syswrite、IO.sysread进行自己的演示

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

其中update_progress_bar()是将进度条增加一个字符的方法。
以上内容没有经过测试,可能会让ruby纯粹主义者感到不舒服。尤其是EOFEException可能会打乱循环。此外,如果没有一个字节不是整数,您还需要某种方法来确保写入所有字节。

或者您可以将其破解为使用scp,如果这是您喜欢的进度条:

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

您必须确保系统调用的源和目标名称已正确转义。
localhost:
标记使scp像在计算机之间一样复制文件,因此它将显示一个进度条。

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

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
需要“rubygems”
需要“progressbar”
在\u name=“src\u file.txt”中
out\u name=“dest\u file.txt”
in_file=file.new(in_name,“r”)
out\u file=file.new(out\u名称,“w”)
in_size=File.size(in_name)
#编辑:浮点除法。
批处理字节=(单位为大小/100.0).ceil
总数=0
p_bar=ProgressBar.new('Copying',100)
buffer=in_file.sysread(批处理字节)
而总尺寸<英寸尺寸
out\u file.syswrite(缓冲区)
普巴公司
总计+=批处理字节数
如果(单位:总大小)
在Windows下,不要忘记为二进制文件添加“b”,因此对于二进制文件,“w”和“r”应分别为“wb”和“rb”

in_file=file.new(in_name,“rb”)
out\u file=file.new(out\u名称,“wb”)

这是一个很好的起点,但由于我无法编辑它,我不得不用我的工作代码添加我自己的答案。这是一个好主意,我没有想到。做得很好。感谢您向我介绍progressbar gem.Usage gem+1:)
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