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{}