github.com/cloudfoundry-incubator/stembuild@v0.0.0-20211223202937-5b61d62226c6/filesystem/filesystem_windows.go (about)

     1  package filesystem
     2  
     3  import (
     4  	"fmt"
     5  	"syscall"
     6  	"unsafe"
     7  )
     8  
     9  type OSFileSystem struct {
    10  }
    11  
    12  func (*OSFileSystem) GetAvailableDiskSpace(path string) (uint64, error) {
    13  	h, err := syscall.LoadDLL("kernel32.dll") // This will throw a panic if it fails. Suggest to use LoadDLL instead
    14  	if err != nil {
    15  		return uint64(0), fmt.Errorf("failed to load kernel32 DLL: %s", err)
    16  	}
    17  	c, err := h.FindProc("GetDiskFreeSpaceExW") // This will throw a panic if it fails. Suggest to use FindProc instead
    18  	if err != nil {
    19  		return uint64(0), fmt.Errorf("failed to find GetDiskFreeSpaceExW procedure: %s", err)
    20  	}
    21  
    22  	var totalBytes uint64    // total bytes
    23  	var freeBytes uint64     // total free bytes
    24  	var userFreeBytes uint64 // total free bytes available to the user
    25  
    26  	ptr, err := syscall.UTF16PtrFromString(path)
    27  	if err != nil {
    28  		return uint64(0), fmt.Errorf("failed to convert: %s", err)
    29  	}
    30  
    31  	r1, _, err := c.Call(uintptr(unsafe.Pointer(ptr)), uintptr(unsafe.Pointer(&userFreeBytes)), uintptr(unsafe.Pointer(&totalBytes)), uintptr(unsafe.Pointer(&freeBytes)))
    32  	if r1 != 1 && err != nil {
    33  		return uint64(0), fmt.Errorf("failed to call OS: %s", err)
    34  	}
    35  	return userFreeBytes, nil
    36  }