在Windows上的Ruby中检查文件的版本

时间:2020-03-05 18:57:03  来源:igfitidea点击:

Ruby中是否可以找到文件的版本,特别是.dll文件的版本?

解决方案

回答

对于任何文件,我们都需要发现文件的格式,然后打开文件并读取必要的字节以了解文件的版本。没有API或者通用方法来确定Ruby中的文件版本。

请注意,如果文件名在文件名中,则会更容易。

回答

如果我们使用的是Microsoft平台,则应该能够在Ruby中使用Win32 API来调用GetFileVersionInfo(),它将返回我们要查找的信息。
http://msdn.microsoft.com/en-us/library/ms647003.aspx

回答

对于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..(.*?)
#!/usr/bin/ruby

s = File.read(ARGV[0])
x = s.match(/F##代码##i##代码##l##代码##e##代码##V##代码##e##代码##r##代码##s##代码##i##代码##o##代码##n##代码##*(.*?)##代码####代码####代码##/)

if x.class == MatchData
  ver=x[1].gsub(/##代码##/,"")
else
  ver="No version"
end

puts ver
0/.match(rstring) puts "FileVersion = #{r ? r[1] : '??' }" else puts "No Version Info" end

"解压" + regexp部分是黑客,"正确"的方法是VerQueryValue API,但这对于大多数文件都适用。 (可能在扩展字符集上失败了。)

回答

如果要使用ruby获取版本信息,但ruby代码未在Windows上运行怎么办?

只需执行以下操作(注意相同的扩展字符集警告):

##代码##