You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

32 lines
665 B

//go:build windows
package capacity
import (
"fmt"
"syscall"
"unsafe"
)
var getDiskFreeSpaceEx = syscall.NewLazyDLL("kernel32.dll").NewProc("GetDiskFreeSpaceExW")
func filesystemFreeBytes(path string) (int64, error) {
pathUTF16, err := syscall.UTF16PtrFromString(path)
if err != nil {
return 0, err
}
var available uint64
result, _, callErr := getDiskFreeSpaceEx.Call(
uintptr(unsafe.Pointer(pathUTF16)),
uintptr(unsafe.Pointer(&available)),
0,
0,
)
if result == 0 {
return 0, fmt.Errorf("GetDiskFreeSpaceExW: %w", callErr)
}
if available > uint64(^uint64(0)>>1) {
return int64(^uint64(0) >> 1), nil
}
return int64(available), nil
}