github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/backend/local/about_windows.go (about) 1 // +build windows 2 3 package local 4 5 import ( 6 "context" 7 "syscall" 8 "unsafe" 9 10 "github.com/pkg/errors" 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 _, _, e1 := getFreeDiskSpace.Call( 20 uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(f.root))), 21 uintptr(unsafe.Pointer(&available)), // lpFreeBytesAvailable - for this user 22 uintptr(unsafe.Pointer(&total)), // lpTotalNumberOfBytes 23 uintptr(unsafe.Pointer(&free)), // lpTotalNumberOfFreeBytes 24 ) 25 if e1 != syscall.Errno(0) { 26 return nil, errors.Wrap(e1, "failed to read disk usage") 27 } 28 usage := &fs.Usage{ 29 Total: fs.NewUsageValue(total), // quota of bytes that can be used 30 Used: fs.NewUsageValue(total - free), // bytes in use 31 Free: fs.NewUsageValue(available), // bytes which can be uploaded before reaching the quota 32 } 33 return usage, nil 34 } 35 36 // check interface 37 var _ fs.Abouter = &Fs{}