英文:
How to get a File description(Product name, Original filname, etc.) using golang in windows?
问题
Fileinfo在golang中提供了名称、修改时间、大小等信息。我需要使用golang在Windows中获取特定文件的描述(例如:产品名称、原始文件名等)。
英文:
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.
答案1
得分: 8
你可以使用w32库在Go语言中调用Win32 API,无需使用CGo。
以下是通过GetFileVersionInfo和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)
}
英文:
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)
}
1: https://github.com/gonutz/w32 "w32 library"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论