Verán tengo un problema con el módulo FileUtils.move...
Si estos 2 archivos existen:
1º - C:\ABC.mp3
2º - D:\ABC.mp3
Imaginen que tenemos el 2º archivo abierto (Reproduciendose en winamp por ejemplo)
Ahora intentamos usar FileUtils.move para mover el 2º archivo, al directorio 1º. El archivo obviamente no se puede reemplazar, el FileUtils.move dará "error de acceso" pero a pesar de eso, FileUtils.move elimina el archivo 1º y desaparece!.
Y entonces nos queda esto:
1º - (NADA)
2º - D:\ABC.mp3
¿Se puede hacer algún tipo de "test" para que no elimine el archivo a reemplazar si da Errno::EACCES?
Lo que quiero decir, Es que primero se asegure de que la operación no va a dar error, Para que no elimine el archivo 1ª si el 2º no se puede mover.
Creo que por ahí leí algo como: FileUtils.test.move pero no estoy seguro...
También he visto FileUtils::NoWrite, PEro no he visto ningún ejemplo de como usarlo, Ni tampoco se si sirve para lo que necesito.
Muchas gracias.
El code que tengo por si sirve para más información es este:
Código
# -*- 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