ruby file file-io copy progress

Ruby muestra progreso al copiar archivos



file file-io (4)

Me gustaría poder mostrar el progreso de una operación de copia de archivo al copiar archivos usando Ruby (actualmente usando FileUtils.cp). He intentado configurar la opción verbose en true pero eso simplemente parece mostrarme el comando de copia emitido.

Estoy ejecutando este script desde la línea de comandos en este momento, así que, idealmente, me gustaría poder presentar algo así como SCP cuando copie archivos, pero no me preocupo demasiado por la presentación, siempre que pueda ver el progreso. .


O simplemente puede piratearlo para usar scp, si esa es la barra de progreso que le gusta:

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

Tendrá que asegurarse de que los nombres de origen y destino estén correctamente escapados para una llamada al sistema. El localhost: tag hace que scp copie los archivos como lo hace entre las computadoras, por lo que mostrará una barra de progreso.


Tira el tuyo usando IO.syswrite, IO.sysread.

Primero, decida la longitud de la barra de progreso (en caracteres) ... entonces este pseudo código debería hacerlo (NO PROBADO):

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

donde update_progress_bar () es su método para incrementar la barra de progreso en un char. Lo anterior no está probado y probablemente hará que los puristas de rubíes se enfermen. En particular, una EOFException podría arruinar el ciclo. También necesitará alguna forma de asegurarse de escribir todos los bytes si no_of_bytes no es un número entero.


En Windows, no olvide agregar la ''b'' para los archivos binarios, por lo que ''w'' y ''r'' deberían ser ''wb'' y ''rb'' para los archivos binarios.

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


Como no tengo suficientes representantes para editar las respuestas, esta es mi versión basada en la respuesta de pisswillis, encontré una barra de progreso que también estoy usando en mi ejemplo. Lo he probado y hasta ahora ha funcionado bien, pero podría ser útil limpiarlo:

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