Проверка версии файла в Ruby в Windows - PullRequest
10 голосов
/ 17 сентября 2008

Есть ли в Ruby способ найти версию файла, в частности, файла .dll?

Ответы [ 5 ]

12 голосов
/ 17 сентября 2008

Для Windows EXE и 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

Часть 'unpack' + regexp - это взлом, "правильный" способ - это API-интерфейс VerQueryValue, но это должно работать для большинства файлов. (возможно, с треском проваливается на расширенных наборах символов.)

5 голосов
/ 27 сентября 2008

Что если вы хотите получить информацию о версии с помощью ruby, но код ruby ​​не работает в Windows?

Следующее делает именно это (обращая внимание на то же предупреждение о расширенной кодировке):

#!/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 голосов
/ 12 июня 2013

Начиная с Ruby 2.0, модуль DL устарел. Вот обновленная версия ответа AShelly, используя 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]
3 голосов
/ 17 сентября 2008

Если вы работаете на платформе Microsoft, вы должны иметь возможность использовать Win32 API в Ruby для вызова GetFileVersionInfo (), который вернет искомую информацию. http://msdn.microsoft.com/en-us/library/ms647003.aspx

1 голос
/ 17 сентября 2008

Для любого файла вам нужно выяснить, в каком формате он находится, а затем открыть файл и прочитать необходимые байты, чтобы узнать, какая версия файла. Не существует API или общего метода для определения версии файла в Ruby.

Обратите внимание, что было бы проще, если бы версия файла была в имени файла.

...