github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/backend/local/about_windows.go (about) 1 //go:build windows 2 3 package local 4 5 import ( 6 "context" 7 "fmt" 8 "syscall" 9 "unsafe" 10 11 "github.com/rclone/rclone/fs" 12 ) 13 14 var getFreeDiskSpace = syscall.NewLazyDLL("kernel32.dll").NewProc("GetDiskFreeSpaceExW") 15 16 // About gets quota information 17 func (f *Fs) About(ctx context.Context) (*fs.Usage, error) { 18 var available, total, free int64 19 root, e := syscall.UTF16PtrFromString(f.root) 20 if e != nil { 21 return nil, fmt.Errorf("failed to read disk usage: %w", e) 22 } 23 _, _, e1 := getFreeDiskSpace.Call( 24 uintptr(unsafe.Pointer(root)), 25 uintptr(unsafe.Pointer(&available)), // lpFreeBytesAvailable - for this user 26 uintptr(unsafe.Pointer(&total)), // lpTotalNumberOfBytes 27 uintptr(unsafe.Pointer(&free)), // lpTotalNumberOfFreeBytes 28 ) 29 if e1 != syscall.Errno(0) { 30 return nil, fmt.Errorf("failed to read disk usage: %w", e1) 31 } 32 usage := &fs.Usage{ 33 Total: fs.NewUsageValue(total), // quota of bytes that can be used 34 Used: fs.NewUsageValue(total - free), // bytes in use 35 Free: fs.NewUsageValue(available), // bytes which can be uploaded before reaching the quota 36 } 37 return usage, nil 38 } 39 40 // check interface 41 var _ fs.Abouter = &Fs{}