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
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?
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