Autor
|
Tema: (Solucionado) [Ruby] Ayuda con rescue! (Leído 3,497 veces)
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
Buenas Tengo hecho un code, He leido sobre Rescue, Raise, Y retry, Pero no lo entiendo del todo... El rescue solo se ejecuta una vez en mi code, Y yo necesito que haga rescues sin parar, Suponía que era con "retry" pero creo que no... Lo único que necesito conseguir es que si al mover el archivo da error (El error EACCES) se intente mover una y otra vez, Hasta conseguirlo. Porfavor una ayuda # Proceso def Mover() for archivo in ARGV[1..ARGV.length].each if File.exist?(ARGV[0] + "\\" + archivo.split('\\').last) response = message_box("Origen:\n" + archivo + "\n\n Destino:\n " + ARGV[0] + "\\" + archivo.split('\\').last + "\n\n El archivo de destino ya existe, Reemplazar archivo?", "Reemplazar archivo?", BUTTONS_YESNO) if response == CLICKED_YES FileUtils.move archivo, ARGV[0] elsif response == CLICKED_CANCEL Process.exit end else FileUtils.move archivo, ARGV[0] end end rescue Errno::EACCES puts "El archivo está en uso" FileUtils.move archivo, ARGV[0] retry end Mover() Process.exit
|
|
« Última modificación: 1 Marzo 2012, 14:40 pm por EleKtro H@cker »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
Creo que entiendo el correcto funcionamiento de rescue, retry, y ensure, he modificado el code y el retry funciona, se crea un bucle infinito que pone "el archivo está en uso"... y cuando deja de estarlo, se mueve el archivo. Hasta ahí bien, pero ahora me surge otro problema al haberlo modificado... Sale un dialogo de windows en el cual si clickas "No" o "Cancelar", el archivo no se mueve, Pero ahora siempre se mueve aunque yo clcike "NO" # Proceso begin def Mover() for archivo in ARGV[1..ARGV.length].each if File.exist?(ARGV[0] + "\\" + archivo.split('\\').last) response = message_box("Origen:\n" + archivo + "\n\n Destino:\n " + ARGV[0] + "\\" + archivo.split('\\').last + "\n\n El archivo de destino ya existe, Reemplazar archivo?", "Reemplazar archivo?", BUTTONS_YESNO) if response == CLICKED_YES FileUtils.move archivo, ARGV[0] elsif response == CLICKED_CANCEL Process.exit end else FileUtils.move archivo, ARGV[0] end end rescue Errno::EACCES puts "El archivo está en uso" retry ensure FileUtils.move archivo, ARGV[0] end end Mover() Process.exit
El fallo supongo que está en el ENSURE, porque claro, se asegura de que el archivo se mueve (Yo pensaba que solo lo haría si da error) Aunque la respuesta sea "CLICKED_CANCEL" lo mueve, Pero entonces... como lo hago?
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
Ya lo he conseguido, he salido del "proceso" para llamar un método y así sí... Aunque sigo teniendo un pequeño problema, mejor lo comento en otro post. un saludo # -*- coding: UTF-8 -*- # Mueve archivos desde un punto de origen hasta un punto de destino # Pensado para usarlo como replazamiento del "SendTo" de Windows. # # (Requiere el uso de argumentos) # Módulos require "FileUtils" require 'dl' exit if Object.const_defined?(:Ocra) # Variables constantes BUTTONS_OKCANCEL = 1 BUTTONS_YESNO = 4 CLICKED_CANCEL = 2 CLICKED_YES = 6 CLICKED_NO = 7 # Métodos def help() print "\nSe requiere al menos 1 archivo de origen.\n\n\n" print "Modo de empleo: \n\n" print ' Mover.rb [Destino] [Archivo de origen 1] [Archivo de origen 2] [etc...]' + "\n\n\n" print 'Ejemplo: (Mover tres archivos al directorio de destino "C:"' + "\n\n" print ' Mover.rb "C:\" "D:\Archivo1.txt" "E:\Archivo2.jpg" "F:\Archivo3.mp3"' + "\n\n" Process.exit end def message_box(txt, title='', buttons='') user32 = DL.dlopen('user32') msgbox = DL::CFunc.new(user32['MessageBoxA'], DL::TYPE_LONG, 'MessageBox') r, rs = msgbox.call([0, txt, title, 3].pack('L!ppL!').unpack('L!*')) return r end def force_move(source_file, dest_file) FileUtils.mv $archivo, ARGV[0] rescue Errno::EACCES response = message_box("El archivo esta en uso:\n" + $archivo + "\n\n Reintentar?", "Reintentar?", BUTTONS_OKCANCEL) if response == CLICKED_YES retry elsif response == CLICKED_CANCEL Process.exit end end # Control de errores if ARGV.empty? == true help() elsif ARGV.length < 2 help() elsif File.directory?(ARGV[0]) == false print "\n El directorio de destino no existe: " + (ARGV[0]) + "\n" Process.exit end for archivo in ARGV[1..ARGV.length].each if File.exist?(archivo) == false print "\n El archivo a mover no existe: " + archivo + "\n" end end # Proceso for $archivo in ARGV[1..ARGV.length].each if File.exist?(ARGV[0] + "\\" + $archivo.split('\\').last) response = message_box("Origen:\n" + $archivo + "\n\n Destino:\n " + ARGV[0] + "\\" + $archivo.split('\\').last + "\n\n El archivo de destino ya existe, Reemplazar archivo?", "Reemplazar archivo?", BUTTONS_YESNO) if response == CLICKED_YES force_move($archivo, ARGV[0]) elsif response == CLICKED_CANCEL Process.exit end else force_move($archivo, ARGV[0]) end end # Fin Process.exit
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Grub rescue> [SOLUCIONADO]
GNU/Linux
|
:ohk<any>
|
8
|
40,065
|
7 Enero 2015, 00:07 am
por Magluss
|
|
|
(Solucionado) [RUBY] Renombrando un caracter ilegal
« 1 2 »
Scripting
|
Eleкtro
|
16
|
12,664
|
21 Febrero 2012, 02:59 am
por Eleкtro
|
|
|
(Solucionado) [Ruby] Colorizando texto
Scripting
|
Eleкtro
|
1
|
3,120
|
20 Febrero 2012, 10:15 am
por Eleкtro
|
|
|
(Solucionado) [Ruby] Exportar una variable a la shell del SO?
Scripting
|
Eleкtro
|
1
|
2,796
|
3 Marzo 2012, 02:40 am
por Eleкtro
|
|
|
(Solucionado) [RUBY] Como filtrar un body html?
Scripting
|
Eleкtro
|
1
|
2,539
|
19 Marzo 2012, 09:58 am
por Eleкtro
|
|