Question

J'aimerais pouvoir afficher la progression d'une opération de copie de fichier lors de la copie de fichiers à l'aide de Ruby (en cours d'utilisation de FileUtils.cp). J'ai essayé de définir l'option verbose sur true mais cela me semble montre-moi la commande de copie émise.

J'utilise ce script à partir de la ligne de commande pour le moment, donc idéalement, j'aimerais pouvoir présenter quelque chose comme SCP le fait lorsqu'il copie des fichiers, mais je ne suis pas trop préoccupé par la présentation aussi longtemps que je peux. voir les progrès.

Était-ce utile?

La solution

Comme je n’ai pas assez de représentants pour modifier les réponses, voici ma version basée sur la réponse pisswillis, j’ai trouvé un gem de la barre de progression que j'utilise également dans mon exemple. J'ai testé cela et cela a bien fonctionné jusqu'à présent, mais cela pourrait faire l'objet d'un nettoyage:

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

Autres conseils

Rouler soi-même avec IO.syswrite, IO.sysread.

Tout d’abord, décidez de la longueur de la barre de progression (en caractères) .. puis ce pseudo-code devrait le faire (NON TESTE):

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

où update_progress_bar () est votre méthode pour incrémenter la barre de progression d'un caractère. Ce qui précède n'est pas testé et rendra probablement les puristes de rubis malades. En particulier, une exception EOFException peut perturber la boucle. Aussi, vous aurez besoin d’un moyen de vous assurer que tous les octets sont écrits si no_of_bytes n’est pas un entier.

Ou vous pouvez simplement pirater pour utiliser scp, si c'est la barre de progression que vous aimez:

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

Vous devez vous assurer que les noms de source et de destination sont correctement protégés pour un appel système. La balise localhost: permet à scp de copier les fichiers comme il le fait entre ordinateurs, ainsi une barre de progression apparaîtra.

Sous Windows, n'oubliez pas d'ajouter le "b" pour les fichiers binaires. "w" et "r" doivent être "wb" et "rb" pour les fichiers binaires.

in_file     = File.new(in_name, "rb")
out_file    = File.new(out_name, "wb")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top