Как в Go Lang прочитать версию файла?
Как прочитать версию файла .exe в windows с помощью GO? Стандартная FileInfo не дает этой информации(
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("C:/Program Files (x86)/file.exe")
if err != nil {
panic(err)
}
fi, err := f.Stat()
if err != nil {
panic(err)
}
fmt.Printf("File name: %v\n", fi.Name())
fmt.Printf("Is Directory: %t\n", fi.IsDir())
fmt.Printf("Size: %d\n", fi.Size())
fmt.Printf("Mode: %v\n", fi.Mode())
fmt.Printf("Sys: %v\n", fi.Sys())
}
Ответы (1 шт):
Автор решения: Senior Pomidor
→ Ссылка
надо использовать Win32 API либу, например, gonutz/w32
import (
"fmt"
"github.com/gonutz/w32"
)
func main() {
const path = `C:/Program Files (x86)/file.exe`
size := w32.GetFileVersionInfoSize(path)
if size <= 0 {
panic("GetFileVersionInfoSize failed")
}
info := make([]byte, size)
ok := w32.GetFileVersionInfo(path, info)
if !ok {
panic("GetFileVersionInfo failed")
}
fixed, ok := w32.VerQueryValueRoot(info)
if !ok {
panic("VerQueryValueRoot failed")
}
version := fixed.FileVersion()
fmt.Printf(
"file version: %d.%d.%d.%d\n",
version&0xFFFF000000000000>>48,
version&0x0000FFFF00000000>>32,
version&0x00000000FFFF0000>>16,
version&0x000000000000FFFF>>0,
)
// see here https://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx
translations, ok := w32.VerQueryValueTranslations(info)
if !ok {
panic("VerQueryValueTranslations failed")
}
if len(translations) == 0 {
panic("no translation found")
}
fmt.Println("translations:", translations)
t := translations[0]
// w32.CompanyName simply translates to "CompanyName"
company, ok := w32.VerQueryValueString(info, t, w32.CompanyName)
if !ok {
panic("cannot get company name")
}
fmt.Println("company:", company)
}