2008-09-16 11 views

Répondre

1

Pour tout fichier, vous devez trouver le format du fichier, puis ouvrir le fichier et lire les octets nécessaires pour connaître la version du fichier. Il n'y a pas d'API ou de méthode commune pour déterminer une version de fichier dans Ruby.

Notez que ce serait plus facile si la version du fichier était dans le nom du fichier.

12

Pour Windows EXE et 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 

Le 'déballer' + partie regexp est un hack, la façon "correcte" est l'API VerQueryValue, mais cela devrait fonctionner pour la plupart des fichiers. (échoue probablement misérablement sur les jeux de caractères étendus.)

5

Et si vous voulez obtenir les informations de version avec ruby, mais le code ruby ​​ne fonctionne pas sur Windows?

Ce qui suit ne vient que (le même avertissement se soucier de jeu de caractères étendu):

#!/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

Comme Ruby de 2,0, le module DL est obsolète. Voici une version mise à jour de la réponse de AShelly, en utilisant 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] 
Questions connexes