Existe-t-il un moyen, dans Ruby, de trouver la version d'un fichier, en particulier un fichier .dll?Vérification de la version du fichier dans Ruby sous Windows
Répondre
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.
Si vous travaillez sur la plate-forme Microsoft, vous devriez pouvoir utiliser l'API Win32 dans Ruby pour appeler GetFileVersionInfo(), qui renverra les informations que vous recherchez. http://msdn.microsoft.com/en-us/library/ms647003.aspx
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.)
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
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]