在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 ver0/.match(rstring) puts "FileVersion = #{r ? r[1] : '??' }" else puts "No Version Info" end
"解压" + regexp部分是黑客,"正确"的方法是VerQueryValue API,但这对于大多数文件都适用。 (可能在扩展字符集上失败了。)
回答
如果要使用ruby获取版本信息,但ruby代码未在Windows上运行怎么办?
只需执行以下操作(注意相同的扩展字符集警告):
##代码##