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.
|
|
|
|
//go:build windows
|
|
|
|
|
|
|
|
|
|
package logstorage
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"syscall"
|
|
|
|
|
"unsafe"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var getLogDiskFreeSpaceEx = syscall.NewLazyDLL("kernel32.dll").NewProc("GetDiskFreeSpaceExW")
|
|
|
|
|
|
|
|
|
|
func filesystemTotalBytes(path string) (int64, error) {
|
|
|
|
|
pathUTF16, err := syscall.UTF16PtrFromString(path)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
var total uint64
|
|
|
|
|
result, _, callErr := getLogDiskFreeSpaceEx.Call(uintptr(unsafe.Pointer(pathUTF16)), 0, uintptr(unsafe.Pointer(&total)), 0)
|
|
|
|
|
if result == 0 {
|
|
|
|
|
return 0, fmt.Errorf("GetDiskFreeSpaceExW: %w", callErr)
|
|
|
|
|
}
|
|
|
|
|
return int64(total), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func filesystemFreeBytes(path string) (int64, error) {
|
|
|
|
|
pathUTF16, err := syscall.UTF16PtrFromString(path)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
var available uint64
|
|
|
|
|
result, _, callErr := getLogDiskFreeSpaceEx.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
|
|
|
|
|
}
|