Rubyでファイルのバージョン、具体的には.dllファイルを見つける方法はありますか?
5 に答える
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の部分はハックであり、「適切な」方法はVerQueryValue APIですが、これはほとんどのファイルで機能するはずです。(おそらく、拡張文字セットでは惨めに失敗します。)
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
Microsoft プラットフォームで作業している場合は、Ruby で Win32 API を使用して、探している情報を返す GetFileVersionInfo() を呼び出すことができるはずです。 http://msdn.microsoft.com/en-us/library/ms647003.aspx
Ruby 2.0 の時点で、この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]
どのファイルについても、ファイルの形式を確認してから、ファイルを開いて必要なバイトを読み取って、ファイルのバージョンを確認する必要があります。Ruby には、ファイルのバージョンを判断するための API や一般的な方法はありません。
ファイルのバージョンがファイル名に含まれていると簡単になることに注意してください。