2009-03-19 13 views
8

Ich möchte in der Lage sein, den Fortschritt eines Dateikopiervorganges zu zeigen, wenn das Kopieren von Dateien Rubin mit (derzeit mit FileUtils.cp) Ich habe versucht, die verbose Option true Einstellung aber, dass nur scheint mir den kopierbefehl angezeigt zu haben.Rubin zeigt Fortschritt beim Kopieren von Dateien

Ich führe dieses Skript von der Befehlszeile im Moment, also möchte ich in der Lage sein, etwas wie SCP zu präsentieren, wenn es Dateien kopiert, aber ich bin nicht allzu nervös über die Präsentation, solange ich kann den Fortschritt sehen.

Antwort

14

Da ich nicht genug Rep haben, um Antworten noch zu bearbeiten hier ist meine Version basierend auf pisswillis Antwort, fand ich eine progress bar gem die ich auch in meinem Beispiel verwende. Ich habe dies getestet und es hat OK bisher gearbeitet, aber es könnte mit einigen tun Reinigung:

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

schön gemacht. Und danke für die Einführung in die Fortschrittsbalken. – pisswillis

+0

nützliches Juwel +1 dafür :) – JstRoRR

7

Rollen Sie Ihre eigenen mit IO.syswrite, IO.sysread.

Zuerst entscheidet Länge von Fortschrittsbalken (in Zeichen) .. dann sollte dieser Pseudo-Code tut es (nicht getestet):

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 

wo update_progress_bar() Ihre Methode ist es, die Fortschrittsbalken um eins zu erhöhen verkohlen. Das obige wird nicht getestet und wird Rubin Puristen wahrscheinlich krank machen. Insbesondere könnte eine EOFException die Schleife durcheinander bringen. Außerdem müssen Sie sicherstellen, dass alle Bytes geschrieben werden, wenn no_of_bytes keine ganze Zahl ist.

+0

Ein guter Ausgangspunkt, aber da ich es nicht bearbeiten konnte, musste ich meine eigene Antwort mit meinem Arbeitscode hinzufügen. – DEfusion

5

Oder Sie könnten es nur hacken scp zu verwenden, wenn das der Fortschrittsbalken ist Sie mögen:

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

Sie werden sicher die Quelle und dest Namen machen müssen ordnungsgemäß für einen Systemaufruf entkommen. Das Tag localhost: bewirkt, dass scp die Dateien wie zwischen den Computern kopiert, so dass eine Fortschrittsleiste angezeigt wird.

+0

Was für eine großartige Idee, dachte nicht daran. – DEfusion

0

unter Windows nicht zu vergessen den ‚b‘ für binäre Dateien hinzuzufügen, so ‚w‘ und ' r 'sollte' wb 'und' rb 'für Binärdateien sein.

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