Có cách nào trong Ruby để tìm phiên bản của tệp, cụ thể là tệp .dll không?Kiểm tra phiên bản của tệp trong Ruby trên Windows
Trả lời
Đối với bất kỳ tệp nào, bạn cần khám phá định dạng của tệp, sau đó mở tệp và đọc các byte cần thiết để tìm ra phiên bản của tệp. Không có API hoặc phương thức chung để xác định phiên bản tệp trong Ruby.
Lưu ý rằng sẽ dễ dàng hơn nếu phiên bản tệp có trong tên tệp.
Nếu bạn đang làm việc trên nền tảng Microsoft, bạn sẽ có thể sử dụng API Win32 trong Ruby để gọi GetFileVersionInfo(), sẽ trả về thông tin bạn đang tìm kiếm. http://msdn.microsoft.com/en-us/library/ms647003.aspx
Đối với của Windows EXE và DLL của:
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
Các 'giải nén' + phần regexp là một hack, cách "đúng đắn" là API VerQueryValue, nhưng điều này sẽ làm việc cho hầu hết các tập tin. (có thể thất bại thảm hại trên các bộ ký tự mở rộng.)
Nếu bạn muốn nhận thông tin phiên bản bằng ruby, nhưng mã ruby không chạy trên Windows?
Sau đây không chỉ là (lưu ý đến những cảnh báo tương tự charset mở rộng):
#!/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
Như của Ruby 2.0, module DL
bị phản đối. Dưới đây là phiên bản cập nhật câu trả lời của AShelly, sử dụng 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]
- 1. Cách kiểm tra phiên bản Meteor.js trên Windows
- 2. Xóa phiên bản cũ của Ruby (trên Windows)
- 3. Làm thế nào để kiểm tra phiên bản của bộ kit Ruby dev được cài đặt trong Windows của tôi?
- 4. shell scripting kiểm tra phiên bản python
- 5. Kiểm tra phiên bản DWARF của đơn vị biên dịch
- 6. Kiểm tra phiên bản VS của Dự án C#
- 7. Kiểm tra Tomcat 7 Phiên bản linux
- 8. Làm cách nào để kiểm tra phiên bản cụ thể của một tệp trong Git?
- 9. Cách kiểm tra phiên bản db2
- 10. kiểm soát phiên bản trên các tệp lớn
- 11. Kiểm tra phiên bản Node hiện tại
- 12. Kiểm tra xem phiên bản DirectX nào được cài đặt
- 13. Làm thế nào để bạn kiểm tra phiên bản windows trong Win32 khi chạy?
- 14. Cách kiểm tra phiên bản sbt?
- 15. Phiên bản Windows Python và VC++ Phiên bản Redistributable Windows
- 16. Cách kiểm tra phiên bản JRE trước khi ra mắt?
- 17. Tôi làm cách nào để kiểm tra phiên bản của phiên bản Liferay?
- 18. Cách chạy phiên bản cũ hơn của node.js trên windows
- 19. Bạn có kiểm tra tệp rvmrc của mình không?
- 20. Phiên bản Ruby của phương thức String
- 21. cách kiểm tra phiên bản jre bằng ứng dụng java
- 22. Cách kiểm tra phiên bản gói haskell trong ./configure?
- 23. Kiểm tra xem tệp có chỉ đọc và thay đổi trong tệp hàng loạt của Windows
- 24. Cách kiểm tra phiên bản Qt đã chọn trong tệp .pro?
- 25. Cách kiểm tra số phiên bản Gradle trong tệp xây dựng?
- 26. Kiểm tra/Thông báo Phiên bản PHP Script
- 27. Cách lập trình kiểm tra phiên bản/mô hình iPad
- 28. Theo dõi các tệp Excel trong Kiểm soát Phiên bản
- 29. Kiểm tra phiên bản ứng dụng của tôi theo lập trình trong thị trường Android
- 30. Kiểm tra xem có phiên bản mới hơn của tệp cục bộ của tôi ở Github không, với R