Ruby 中有没有办法找到文件的版本,特别是 .dll 文件?
Clark
问问题
3734 次
5 回答
12
对于 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,但这应该适用于大多数文件。(可能在扩展字符集上失败得很惨。)
于 2008-09-16T21:41:25.883 回答
5
如果您想使用 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
于 2008-09-27T00:13:26.540 回答
3
如果您在 Microsoft 平台上工作,您应该能够使用 Ruby 中的 Win32 API 调用 GetFileVersionInfo(),它将返回您正在寻找的信息。 http://msdn.microsoft.com/en-us/library/ms647003.aspx
于 2008-09-16T20:38:52.197 回答
3
从 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]
于 2013-06-12T14:58:30.073 回答
1
对于任何文件,您都需要发现文件的格式,然后打开文件并读取必要的字节以找出文件的版本。Ruby 中没有确定文件版本的 API 或通用方法。
请注意,如果文件版本在文件名中会更容易。
于 2008-09-16T20:23:20.860 回答