Ruby中有没有办法找到文件的版本,特别是.dll文件?
对于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部分是一个hack,"正确"的方式是VerQueryValue API,但这适用于大多数文件.(可能在扩展字符集上失败了.)
如果你想用ruby获取版本信息怎么办,但ruby代码没有在Windows上运行?
以下就是这样(注意相同的扩展charset警告):
#!/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