elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  (Medio solucionado xD) [Ruby]Comprobar si un archivo está abierto por un proceso
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Medio solucionado xD) [Ruby]Comprobar si un archivo está abierto por un proceso  (Leído 2,939 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
(Medio solucionado xD) [Ruby]Comprobar si un archivo está abierto por un proceso
« en: 1 Marzo 2012, 14:50 pm »

Hola

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
  1. # -*- coding: UTF-8 -*-
  2.  
  3. # Mueve archivos desde un punto de origen hasta un punto de destino
  4. # Pensado para usarlo como replazamiento del "SendTo" de Windows.
  5. #
  6. # (Requiere el uso de argumentos)
  7.  
  8.  
  9. # Módulos
  10.  
  11. require "FileUtils"
  12. require 'dl'
  13.  
  14. exit if Object.const_defined?(:Ocra)
  15.  
  16.  
  17. # Variables constantes
  18.  
  19. BUTTONS_OKCANCEL = 1
  20. BUTTONS_YESNO = 4
  21. CLICKED_CANCEL = 2
  22. CLICKED_YES = 6
  23. CLICKED_NO = 7
  24.  
  25.  
  26. # Métodos
  27.  
  28. def help()
  29. print "\nSe requiere al menos 1 archivo de origen.\n\n\n"
  30. print "Modo de empleo: \n\n"
  31. print ' Mover.rb [Destino] [Archivo de origen 1] [Archivo de origen 2] [etc...]' + "\n\n\n"
  32. print 'Ejemplo: (Mover tres archivos al directorio de destino "C:"' + "\n\n"
  33. print ' Mover.rb "C:\" "D:\Archivo1.txt" "E:\Archivo2.jpg" "F:\Archivo3.mp3"' + "\n\n"
  34. Process.exit
  35. end
  36.  
  37. def message_box(txt, title='', buttons='')
  38.    user32 = DL.dlopen('user32')
  39. msgbox = DL::CFunc.new(user32['MessageBoxA'], DL::TYPE_LONG, 'MessageBox')
  40. r, rs = msgbox.call([0, txt, title, 3].pack('L!ppL!').unpack('L!*'))
  41.    return r
  42. end
  43.  
  44. def force_move(source_file, dest_file)
  45.  FileUtils.mv $archivo, ARGV[0]
  46.  rescue Errno::EACCES
  47.   response = message_box("El archivo esta en uso:\n" + $archivo  + "\n\n Reintentar?", "Reintentar?", BUTTONS_OKCANCEL)
  48. if response == CLICKED_YES
  49.       retry
  50.   elsif response == CLICKED_CANCEL
  51.       Process.exit
  52.  end
  53. end
  54.  
  55.  
  56. # Control de errores
  57.  
  58. if ARGV.empty? == true
  59. help()
  60. elsif ARGV.length < 2
  61. help()
  62. elsif File.directory?(ARGV[0]) == false
  63. print "\n El directorio de destino no existe: " + (ARGV[0]) + "\n"
  64. Process.exit
  65. end
  66.  
  67. for archivo in ARGV[1..ARGV.length].each
  68. if File.exist?(archivo) == false
  69. print "\n El archivo a mover no existe: " + archivo + "\n"
  70. end
  71.  
  72. end
  73.  
  74.  
  75. # Proceso
  76.  
  77. for $archivo in ARGV[1..ARGV.length].each
  78.  
  79. if File.exist?(ARGV[0] + "\\" + $archivo.split('\\').last)
  80. 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)
  81. if response == CLICKED_YES
  82.   force_move($archivo, ARGV[0])
  83.   elsif response == CLICKED_CANCEL
  84.   Process.exit
  85. end
  86. else
  87. force_move($archivo, ARGV[0])
  88. end
  89.  
  90. end
  91.  
  92.  
  93. # Fin
  94. Process.exit


« Última modificación: 3 Marzo 2012, 07:04 am por EleKtro H@cker » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: [Ruby] Problema con el módulo FileUtils. ¿Alternativa?
« Respuesta #1 en: 2 Marzo 2012, 23:32 pm »

Me he mirado todo el módulo Kernel, FileUtils, Sysread, test, filestat, Process::Sys, IO, IO::WaitReadable, IO::WaitWritable, IOError... y el ftools

No encuentro la manera de como averiguar si un proceso (Cualquiera) tiene abierto un archivo.


¿alguna ayuda? :(

EDITO:
Joder, con lo fácil que es hacerlo en batch... Pero no quiero depender de eso.

Supongo que tendré que buscar hasta encontrar alguna gema parecida al "CMDOW" para windows xD


« Última modificación: 2 Marzo 2012, 23:45 pm por EleKtro H@cker » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: [Ruby] Problema con el módulo FileUtils. ¿Alternativa?
« Respuesta #2 en: 3 Marzo 2012, 06:50 am »

Al final he recurrido a un programa de terceros (CMDOW) para windows...

Posteo el code pa quien lo quiera probar (Aviso que soy novato, pueden sobrar varias cosas pero funciona bien), Me ha costado mucho esfuerzo xD

Ahora es cuando debería sonar una melodia de VICTORY! I'm great! ::)

salu2

Código
  1. # Mueve archivos desde un punto de origen hasta un punto de destino
  2. # Pensado para usarlo como replazamiento del "SendTo" de Windows.
  3. #
  4. # (Requiere el uso de argumentos)
  5.  
  6.  
  7.  
  8. # Modulos
  9.  
  10. require "FileUtils"
  11. require 'dl'
  12.  
  13. exit if Object.const_defined?(:Ocra)
  14.  
  15.  
  16.  
  17. # Variables constantes
  18.  
  19. BUTTONS_OKCANCEL = 1
  20. BUTTONS_YESNO = 4
  21. CLICKED_CANCEL = 2
  22. CLICKED_YES = 6
  23. CLICKED_NO = 7
  24.  
  25.  
  26.  
  27. # Metodos
  28.  
  29. def help()
  30. print "\nSe requiere al menos 1 archivo de origen.\n\n\n"
  31. print "Modo de empleo: \n\n"
  32. print ' Mover.rb [Destino] [Archivo de origen 1] [Archivo de origen 2] [etc...]' + "\n\n\n"
  33. print ' Ejemplo: (Mover tres archivos al directorio de destino "C:"' + "\n\n"
  34. print ' Mover.rb "C:\" "D:\Archivo1.txt" "E:\Archivo2.jpg" "F:\Archivo3.mp3"' + "\n\n"
  35. Process.exit
  36. end
  37.  
  38. def message_box(txt, title='', buttons='')
  39.    user32 = DL.dlopen('user32')
  40. msgbox = DL::CFunc.new(user32['MessageBoxA'], DL::TYPE_LONG, 'MessageBox')
  41. r, rs = msgbox.call([0, txt, title, 3].pack('L!ppL!').unpack('L!*'))
  42.    return r
  43. end
  44.  
  45. def force_move(source_file, dest_file)
  46.  
  47.  rescue Errno::EACCES
  48.   response = message_box("El archivo esta en uso:\n" + $archivo  + "\n\n Reintentar?", "Reintentar?", BUTTONS_OKCANCEL)
  49. if response == CLICKED_YES
  50.    Access($archivo, ARGV[0])
  51.       retry
  52.   elsif response == CLICKED_CANCEL
  53.       Process.exit
  54.  end
  55. end
  56.  
  57. def reintentar(source_file, dest_file)
  58.  response = message_box("El archivo esta en uso:\n" + $archivo  + "\n\n Reintentar?", "Reintentar?", BUTTONS_OKCANCEL)
  59. if response == CLICKED_YES
  60.      Access($archivo, ARGV[0])
  61.   elsif response == CLICKED_NO
  62.   nil
  63.   elsif response == CLICKED_CANCEL
  64.       Process.exit
  65. end
  66. end
  67.  
  68. def Access(source_file, dest_file)
  69. ENV['tmp'] = $archivo.split('\\').last
  70. 'cheat environment_variables --add'
  71. puts %x[cmdow.exe | Find "%tmp:~0,30%" >NUL]
  72. response = $?.exitstatus
  73. if response == 0
  74.    reintentar($archivo, ARGV[0])
  75. elsif response == 1
  76.    FileUtils.mv $archivo, ARGV[0]
  77. end
  78. end
  79.  
  80.  
  81.  
  82. # Control de errores
  83.  
  84. if ARGV.empty? == true
  85. help()
  86. elsif ARGV.length < 2
  87. help()
  88. elsif File.directory?(ARGV[0]) == false
  89. print "\n El directorio de destino no existe: " + (ARGV[0]) + "\n"
  90. Process.exit
  91. end
  92.  
  93. for archivo in ARGV[1..ARGV.length].each
  94. if File.exist?(archivo) == false
  95. print "\n El archivo a mover no existe: " + archivo + "\n"
  96. end
  97. end
  98.  
  99.  
  100.  
  101.  
  102. # Proceso
  103.  
  104. for $archivo in ARGV[1..ARGV.length].each
  105. if File.exist?(ARGV[0] + "\\" + $archivo.split('\\').last)
  106. force_move($archivo, ARGV[0])
  107. 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)
  108. if response == CLICKED_YES
  109.   Access($archivo, ARGV[0])
  110.   elsif response == CLICKED_NO
  111.   nil
  112.   elsif response == CLICKED_CANCEL
  113.   Process.exit
  114. end
  115. else
  116. Access($archivo, ARGV[0])
  117. end
  118. end
  119.  
  120.  
  121. # Fin
  122. Process.exit


   
   


PD: El archivo de destino ya no se elimina al clickar "Reemplazar (SI)" porque primero comprueba si está en uso antes de usar el módulo FileUtils   :)
« Última modificación: 3 Marzo 2012, 07:04 am por EleKtro H@cker » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado] Alguna Alternativa de hWnd para del Timer (1 Modulo SIN FORM)
Programación Visual Basic
BlackZeroX 4 4,355 Último mensaje 10 Febrero 2009, 04:25 am
por BlackZeroX
problema con ruby
GNU/Linux
Mr.Blue 1 2,303 Último mensaje 29 Mayo 2010, 21:40 pm
por leogtz
[Ruby] Problema con Scripts
Scripting
MeCraniDOS 4 3,222 Último mensaje 8 Noviembre 2012, 00:26 am
por MeCraniDOS
[Ruby]¿Que hacen las siguientes funciones del modulo Math?
Scripting
Segadorfelix 2 2,662 Último mensaje 20 Febrero 2013, 03:59 am
por Segadorfelix
Problema Script Ruby
Scripting
daniel.r.23 1 2,115 Último mensaje 30 Marzo 2013, 22:48 pm
por RyogiShiki
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines