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