2008-09-16 14 views

Respuesta

1

Para cualquier archivo, necesitaría descubrir en qué formato está el archivo, y luego abrir el archivo y leer los bytes necesarios para averiguar de qué versión es el archivo. No hay API o método común para determinar una versión de archivo en Ruby.

Tenga en cuenta que sería más fácil si la versión del archivo estuviera en el nombre del archivo.

12

Para Windows EXE y DLL:

require "Win32API" 
FILENAME = "c:/ruby/bin/ruby.exe" #your filename here 
s="" 
vsize=Win32API.new('version.dll', 'GetFileVersionInfoSize', 
        ['P', 'P'], 'L').call(FILENAME, s) 
p vsize 
if (vsize > 0) 
    result = ' '*vsize 
    Win32API.new('version.dll', 'GetFileVersionInfo', 
       ['P', 'L', 'L', 'P'], 'L').call(FILENAME, 0, vsize, result) 
    rstring = result.unpack('v*').map{|s| s.chr if s<256}*'' 
    r = /FileVersion..(.*?)\000/.match(rstring) 
    puts "FileVersion = #{r ? r[1] : '??' }" 
else 
    puts "No Version Info" 
end 

El 'descomprimir' + parte de expresiones regulares es un truco, la forma "correcta" es la API VerQueryValue, pero esto debería funcionar para la mayoría de los archivos. (Probablemente falla miserablemente en juegos de caracteres extendidos.)

5

¿Qué sucede si desea obtener la información de la versión con ruby, pero el código ruby ​​no se está ejecutando en Windows?

El siguiente no sólo que (hacer caso a la misma advertencia charset extendida):

#!/usr/bin/ruby 

s = File.read(ARGV[0]) 
x = s.match(/F\0i\0l\0e\0V\0e\0r\0s\0i\0o\0n\0*(.*?)\0\0\0/) 

if x.class == MatchData 
    ver=x[1].gsub(/\0/,"") 
else 
    ver="No version" 
end 

puts ver 
3

Como de Rubí 2.0, el módulo DL está en desuso. Aquí hay una versión actualizada de la respuesta de AShelly, usando Fiddle:

version_dll = Fiddle.dlopen('version.dll') 

s='' 
vsize = Fiddle::Function.new(version_dll['GetFileVersionInfoSize'], 
      [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], 
      Fiddle::TYPE_LONG).call(filename, s) 

raise 'Unable to determine the version number' unless vsize > 0 

result = ' '*vsize 
Fiddle::Function.new(version_dll['GetFileVersionInfo'], 
        [Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG, 
         Fiddle::TYPE_LONG, Fiddle::TYPE_VOIDP], 
     Fiddle::TYPE_VOIDP).call(filename, 0, vsize, result) 

rstring = result.unpack('v*').map{|s| s.chr if s<256}*'' 
r = /FileVersion..(.*?)\000/.match(rstring) 

puts r[1] 
Cuestiones relacionadas