2008-09-16 16 views
9

पर रूबी में फ़ाइल का संस्करण जांचना क्या फ़ाइल के संस्करण को खोजने के लिए रूबी में कोई तरीका है, खासकर एक .dll फ़ाइल?विंडोज

उत्तर

1

किसी भी फ़ाइल के लिए, आपको यह पता लगाना होगा कि फ़ाइल किस प्रारूप में है, और फिर फ़ाइल खोलें और यह जानने के लिए आवश्यक बाइट्स को पढ़ें कि फ़ाइल का कौन सा संस्करण है। रूबी में फ़ाइल संस्करण निर्धारित करने के लिए कोई एपीआई या सामान्य विधि नहीं है।

ध्यान दें कि फ़ाइल संस्करण फ़ाइल नाम में था तो यह आसान होगा।

3

यदि आप माइक्रोसॉफ्ट प्लेटफ़ॉर्म पर काम कर रहे हैं, तो आपको GetFileVersionInfo() पर कॉल करने के लिए रूबी में Win32 API का उपयोग करने में सक्षम होना चाहिए, जो आप जिस जानकारी को खोज रहे हैं उसे वापस कर देगा। http://msdn.microsoft.com/en-us/library/ms647003.aspx

12

विंडोज 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 

'खोल' + regexp हिस्सा एक हैक है, "उचित" जिस तरह से VerQueryValue एपीआई है, लेकिन इस सबसे फ़ाइलों के लिए काम करना चाहिए। (शायद विस्तारित चरित्र सेट पर बुरी तरह विफल हो जाता है।)

5

क्या होगा यदि आप रूबी के साथ संस्करण जानकारी प्राप्त करना चाहते हैं, लेकिन रूबी कोड विंडोज पर नहीं चल रहा है?

निम्नलिखित सिर्फ इतना है कि (heeding ही विस्तारित चारसेट चेतावनी) करता है:

#!/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 
3

रूबी 2.0 के रूप में, DL मॉड्यूल मान्य नहीं है। Fiddle का उपयोग करके एशेलली के उत्तर का एक अद्यतन संस्करण यहां दिया गया है:

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]