28 lines
774 B
Go
28 lines
774 B
Go
|
package main
|
||
|
|
||
|
import "golang.org/x/sys/windows"
|
||
|
|
||
|
// getLongPathName converts Windows short pathnames to full pathnames.
|
||
|
// For example C:\Users\ADMIN~1 --> C:\Users\Administrator.
|
||
|
// It is a no-op on non-Windows platforms
|
||
|
func getLongPathName(path string) (string, error) {
|
||
|
// See https://groups.google.com/forum/#!topic/golang-dev/1tufzkruoTg
|
||
|
p, err := windows.UTF16FromString(path)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
b := p // GetLongPathName says we can reuse buffer
|
||
|
n, err := windows.GetLongPathName(&p[0], &b[0], uint32(len(b)))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
if n > uint32(len(b)) {
|
||
|
b = make([]uint16, n)
|
||
|
_, err = windows.GetLongPathName(&p[0], &b[0], uint32(len(b)))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
}
|
||
|
return windows.UTF16ToString(b), nil
|
||
|
}
|