Ruby (現在は FileUtils.cp を使用) を使用してファイルをコピーするときに、ファイル コピー操作の進行状況を表示できるようにしたいと思いverbose
ますtrue
。
現時点ではコマンド ラインからこのスクリプトを実行しているので、理想的には、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
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が整数でない場合は、すべてのバイトが書き込まれるようにするための何らかの方法が必要になります。
または、それが好きなプログレスバーである場合は、scp を使用するようにハックすることもできます。
def copy(source, dest)
`scp #{source} localhost:#{dest}`
end
ソース名と宛先名がシステム コールに対して適切にエスケープされていることを確認する必要があります。このlocalhost:
タグにより、scp はコンピューター間で行うのと同じようにファイルをコピーするため、進行状況バーが表示されます。