Frage

Ich möchte in der Lage sein, den Fortschritt eines Dateikopiervorganges zu zeigen, wenn Dateien mit Ruby (derzeit mit FileUtils.cp) kopiert habe ich versucht, die verbose Option auf true aber das scheint nur um mir zu zeigen, um die Kopie Befehl ausgegeben.

Ich bin mit diesem Skript von der Kommandozeile im Moment so im Idealfall würde ich so etwas wie SCP in der Lage sein möchten präsentieren tut, wenn es kopiert Dateien, aber ich bin nicht allzu viel Aufhebens über die Präsentation so lange, wie ich kann sehen den Fortschritt an.

War es hilfreich?

Lösung

Da ich nicht genug rep Antworten bearbeiten noch hier ist meine Version basiert auf pisswillis Antwort, fand ich eine Fortschrittsbalken gem , die ich bin auch in meinem Beispiel. 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

Andere Tipps

Bewegen Sie Ihre eigene mit IO.syswrite, IO.sysread.

Zuerst entscheidet Länge von Fortschrittsbalken (in Zeichen) .. dann dieser Pseudo-Code sollte es tun (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

Dabei gilt update_progress_bar () Ihre Methode ist es, den Fortschrittsbalken durch ein Zeichen zu erhöhen. Die oben ist nicht getestet und wird wahrscheinlich Ruby-Puristen krank machen. Insbesondere eine EOFException Macht vermasseln die Schleife. Auch müssen Sie eine Möglichkeit, sicherzustellen, dass alle Bytes geschrieben werden, wenn no_of_bytes keine ganze Zahl ist.

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

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

Sie werden die Quell- und dest Namen dafür sorgen müssen für einen Systemaufruf ordnungsgemäß entkommen. Die localhost: Tag macht scp kopieren Sie die Dateien, wie es zwischen den Computern der Fall ist, so wird es einen Fortschrittsbalken zeigen.

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

in_file     = File.new(in_name, "rb")
out_file    = File.new(out_name, "wb")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top