【问题标题】:Checking version of file in Ruby on Windows在 Windows 上检查 Ruby 中的文件版本
【发布时间】:2010-09-09 17:46:55
【问题描述】:

Ruby 中有没有办法找到文件的版本,特别是 .dll 文件?

【问题讨论】:

    标签: ruby file dll version


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果您在 Microsoft 平台上工作,您应该能够使用 Ruby 中的 Win32 API 调用 GetFileVersionInfo(),这将返回您正在寻找的信息。 http://msdn.microsoft.com/en-us/library/ms647003.aspx

      【讨论】:

        【解决方案3】:

        对于 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,但这应该适用于大多数文件。 (在扩展字符集上可能会失败。)

        【讨论】:

          【解决方案4】:

          如果您想使用 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
          

          【讨论】:

            【解决方案5】:

            从 Ruby 2.0 开始,DL 模块已被弃用。这是 AShelly 答案的更新版本,使用 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]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-02-24
              • 2013-07-21
              • 2017-12-01
              • 2023-03-16
              • 2010-12-30
              • 1970-01-01
              • 2013-05-12
              相关资源
              最近更新 更多