Czy istnieje sposób w Ruby, aby znaleźć wersję pliku, w szczególności plik .dll?Sprawdzanie wersji pliku w Ruby na Windows
Odpowiedz
Dla każdego pliku należy sprawdzić, w jakim formacie znajduje się plik, a następnie otworzyć plik i odczytać potrzebne bajty, aby dowiedzieć się, jaka to wersja pliku. Nie ma API ani wspólnej metody ustalania wersji pliku w Ruby.
Należy pamiętać, że byłoby łatwiej, gdyby wersja pliku znajdowała się w nazwie pliku.
Jeśli pracujesz na platformie Microsoft, powinieneś być w stanie użyć API Win32 w Ruby, aby wywołać metodę GetFileVersionInfo(), która zwróci informacje, których szukasz. http://msdn.microsoft.com/en-us/library/ms647003.aspx
W systemie Windows EXE i 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
do 'rozpakowania' + część regexp jest hack, "właściwego" sposób jest API VerQueryValue, ale to powinno działać na większości plików. (prawdopodobnie nie udaje się marnie na rozszerzonych zestawach znaków).
Co zrobić, jeśli chcesz uzyskać informacje o wersji z ruby, ale kod ruby nie działa w systemie Windows?
Poniższa właśnie to robi (zważając na to samo ostrzeżenie rozszerzonego zestawu znaków):
#!/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
Jak Ruby 2.0, moduł DL
jest przestarzała. Poniżej znajduje się zaktualizowana wersja odpowiedzi AShelly'ego, korzystająca z 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. Sprawdzanie wersji zainstalowanego kąta-cli?
- 2. Sprawdzanie zgodności wersji java
- 3. Sprawdzanie wersji C++ na moim laptopie
- 4. Sprawdzanie wersji Maven
- 5. Sprawdzanie poprawności argumentów w Ruby?
- 6. Ruby na szynach, wielokrotne sprawdzanie zerowych atrybutów
- 7. Jak zaktualizować ruby w Windows
- 8. Sprawdzanie wersji Groovy Gradle używa
- 9. Sprawdzanie nazwy wersji aplikacji zewnętrznej w Androidzie
- 10. Sprawdzanie wersji iOS daje ostrzeżenie
- 11. Sprawdzanie zmian w bazie danych (kontrola wersji)
- 12. Sprawdzanie wersji modułu Python w środowisku wykonawczym
- 13. Ruby: Sprawdzanie szerokości wschodnioazjatyckiej (Unicode)
- 14. Drukowanie pliku na drukarce w języku Ruby
- 15. Sprawdzanie pustego pliku w C++
- 16. Sprawdzanie istnienia pliku na serwerze FTP
- 17. Zmiana wersji Ruby używanej w Sublime
- 18. Nokogiri wymaga wersji Ruby <2.3
- 19. Sprawdzanie pliku Groovy
- 20. Sprawdzanie uprawnień właściciela pliku
- 21. Sprawdzanie tożsa tożsamość systemu Windows
- 22. Sprawdzanie poprawności pliku WADL
- 23. Uzyskaj ruby do używania menedżera wersji ruby (rvm)
- 24. Tryb otwierania pliku w Ruby
- 25. Używanie wartownika-minitest na jednym pliku Ruby
- 26. Odtworzenie wersji za pomocą Carrierwave z Ruby
- 27. Aktualizowanie pliku YAML w Ruby
- 28. PHP Sprawdzanie poprawności przesłania pliku
- 29. Menedżer wersji Ruby złamał mój $ PATH
- 30. Ruby: Sprawdzanie, czy URI to HTTPS?