9

Ruby (現在は FileUtils.cp を使用) を使用してファイルをコピーするときに、ファイル コピー操作の進行状況を表示できるようにしたいと思いverboseますtrue

現時点ではコマンド ラインからこのスクリプトを実行しているので、理想的には、SCP がファイルをコピーするときに行うようなものを表示できるようにしたいと考えていますが、進行状況を見ることができる限り、表示についてはあまり気にしません。 .

4

4 に答える 4

14

回答を編集するのに十分な担当者がいないので、ここに 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
于 2009-03-19T14:09:50.670 に答える
7

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()は、プログレスバーを1文字ずつインクリメントするメソッドです。上記はテストされておらず、おそらくルビーの純粋主義者を病気にするでしょう。特に、EOFExceptionがループを台無しにする可能性があります。また、no_of_bytesが整数でない場合は、すべてのバイトが書き込まれるようにするための何らかの方法が必要になります。

于 2009-03-19T12:34:56.653 に答える
6

または、それが好きなプログレスバーである場合は、scp を使用するようにハックすることもできます。

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

ソース名と宛先名がシステム コールに対して適切にエスケープされていることを確認する必要があります。このlocalhost:タグにより、scp はコンピューター間で行うのと同じようにファイルをコピーするため、進行状況バーが表示されます。

于 2009-03-19T13:49:08.707 に答える