2009-03-19 13 views
8

Ruby kullanarak dosyaları kopyalarken (şu anda FileUtils.cp kullanarak) bir dosya kopyalama işleminin ilerlemesini göstermek istiyorum verbose seçeneğini true olarak ayarlamayı denedim ama bana verilen kopya komutunu gösteriyor.Ruby, dosyaları kopyalarken ilerleme durumunu gösterir

Bu komut dosyasını şu anda komut satırından çalıştırıyorum, böylelikle SCP'nin dosyaları kopyalarken yaptığı gibi sunabilmeyi çok isterim, ancak sunum kadar uzağım yok. ilerlemeyi görebilir.

cevap

14

Henüz yanıtları düzenlemek için yeterli temsilcim olmadığından, pisswillis yanıtına dayanan bir versiyonum var. Bu örnekte de kullandığım bir progress bar gem buldum. Bunu test ettik ve bugüne kadar tamam çalıştı, ancak temizlik bazı yapabileceğini: Windows altında

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

güzel bitti. Ve beni progressbar gem için tanıttığınız için teşekkür ederiz. Bunun için – pisswillis

+0

yararlı gem +1 :) – JstRoRR

7

IO.syswrite, IO.sysread'i kullanarak kendi rulonuzu açın.

Birincisi, (karakter olarak) ilerleme çubuğunun uzunluğu karar .. o zaman bu sözde kodu (TEST DEĞİL) bunu yapmalıdır:

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() birer ilerleme çubuğu artırmak için yöntem olduğu Char. Yukarıdaki test edilmemiştir ve muhtemelen ruby ​​purists hasta olacaktır. Özellikle bir EOFException, döngüyü bozabilir. Ayrıca, no_of_bytes bir tamsayı değilse, tüm baytların yazıldığından emin olmanın bir yoluna ihtiyacınız olacaktır.

+0

Harika bir başlangıç ​​noktası, ancak düzenleme yapamadığım için kendi yanıtımı kendi çalışma kodumla eklemem gerekiyordu. – DEfusion

5

Ya da sadece o sizin gibi ilerleme çubuğu eğer o, scp kullanmak kesmek olabilir: düzgün bir sistem çağrısı için kaçan emin kaynak ve hedef adlarını yapmak gerekecek

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

. localhost: etiketi, scp dosyalarını dosyaları bilgisayarlar arasında olduğu gibi kopyaladığından, bir ilerleme çubuğu gösterecektir.

+0

Harika bir fikir, bunun hakkında düşünmedim. – DEfusion

0

yüzden 'w' ve 'ikili dosyalar için 'b' eklemeyi unutmayın r 'ikili dosyalar için' wb 've' rb 'olmalıdır.

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