2008-09-16 11 views

答えて

1

どのファイルでも、そのファイルがどのようなフォーマットであるかを発見してから、そのファイルを開いて、ファイルのバージョンを調べる必要があります。 Rubyのファイルバージョンを特定するためのAPIや一般的なメソッドはありません。

ファイルバージョンがファイル名に含まれていれば、より簡単になることに注意してください。

3

Microsoftプラットフォームで作業している場合、RubyでWin32 APIを使用して、GetFileVersionInfo()を呼び出すことができます。これにより、探している情報が返されます。 Windowsの場合 http://msdn.microsoft.com/en-us/library/ms647003.aspx

12

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 

、「正しい」方法は、VerQueryValue APIですが、これはほとんどのファイルのために働く必要があります。 (拡張文字セットではおそらく失敗します)

5

ルビーでバージョン情報を取得したいのに、ルビーコードがWindowsで実行されていない場合はどうなりますか?

下記ないだけ(同じ拡張文字セットの警告を聞き入れ)は:ルビー2.0のよう

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

DLモジュールは廃止されます。ここでは、Fiddleを使用して、AShellyの答えの更新版があります。

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] 
関連する問題