Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get a File description(Product name, Original filname, etc.) using golang in windows?

Tags:

go

Fileinfo in golang gives Name, time modified, size, etc. I need to get particular File's description(eg: Product name, Original filname, etc.) using golang in windows.

like image 586
Nandhakumar Balasubramaniam Avatar asked Aug 23 '17 15:08

Nandhakumar Balasubramaniam


1 Answers

You can use the w32 library for Win32 API calls from Go. No CGo needed.

Here is an example of how you can retrieve all file information through GetFileVersionInfo and VerQueryValue:

package main

import (
    "fmt"
    "github.com/gonutz/w32/v2"
)

func main() {
    const path = `C:\some file`

    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,
    )

    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)
}
like image 127
gonutz Avatar answered Sep 21 '22 03:09

gonutz