(Solucionado) [Ruby] Ayuda con rescue!

Iniciado por Eleкtro, 26 Febrero 2012, 18:43 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

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


Código (ruby) [Seleccionar]
# 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








Eleкtro

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"

Código (ruby) [Seleccionar]
# 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?








Eleкtro

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

Código (ruby) [Seleccionar]
# -*- 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