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 }