3 回答

TA貢獻1825條經驗 獲得超4個贊
您鏈接的問題+答案顯示了如何獲得可用空間。該解決方案使用 中的GetDiskFreeSpaceExW()
Windows API 函數來kernel32.dll
獲取它。
同樣的函數也可以用來獲取總大小。函數簽名GetDiskFreeSpaceExW()
:
BOOL?GetDiskFreeSpaceExW( ??LPCWSTR?????????lpDirectoryName, ??PULARGE_INTEGER?lpFreeBytesAvailableToCaller, ??PULARGE_INTEGER?lpTotalNumberOfBytes, ??PULARGE_INTEGER?lpTotalNumberOfFreeBytes );
它有一個輸入參數,路徑,它有 3 個輸出參數,即空閑字節數(可供調用者使用)、總字節數(磁盤大?。┖涂偪臻e字節數。
因此,只需在您調用它時,為您想要從中獲取的所有信息提供變量(指針)。
例如:
kernelDLL := syscall.MustLoadDLL("kernel32.dll")
GetDiskFreeSpaceExW := kernelDLL.MustFindProc("GetDiskFreeSpaceExW")
var free, total, avail int64
path := "c:\\"
r1, r2, lastErr := GetDiskFreeSpaceExW.Call(
? ? uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(path))),
? ? uintptr(unsafe.Pointer(&free)),
? ? uintptr(unsafe.Pointer(&total)),
? ? uintptr(unsafe.Pointer(&avail)),
)
fmt.Println(r1, r2, lastErr)
fmt.Println("Free:", free, "Total:", total, "Available:", avail)
運行它,示例輸出:
1 0 Success.
Free: 16795295744 Total: 145545281536 Available: 16795295744

TA貢獻1784條經驗 獲得超2個贊
由于系統調用已棄用,其他回復已過時。
您現在必須使用 golang.org/x/sys/windows:
import (
? ? "fmt"
? ? "golang.org/x/sys/windows"
)
// print disk usage of path/disk
func DiskUsage(path string) bool {
? ? var free, total, avail uint64
? ? path = "c:\\"
? ? pathPtr, err := windows.UTF16PtrFromString(path)
? ? if err != nil{
? ? ? ? panic(err)
? ? }
? ? err = windows.GetDiskFreeSpaceEx(pathPtr, &free, &total, &avail)
? ? fmt.Println("Free:", free, "Total:", total, "Available:", avail)
}

TA貢獻1865條經驗 獲得超7個贊
在GetDiskFreeSpraceExW的文檔中,該函數聲明為:
BOOL GetDiskFreeSpaceExW(
? LPCWSTR? ? ? ? ?lpDirectoryName,
? PULARGE_INTEGER lpFreeBytesAvailableToCaller,
? PULARGE_INTEGER lpTotalNumberOfBytes,
? PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
因此,您可以在一次調用中獲得總大小和可用大?。?/p>
import "syscall"
import "os"
func main() {
? ? wd := os.Getwd()
? ? h := syscall.MustLoadDLL("kernel32.dll")
? ? c := h.MustFindProc("GetDiskFreeSpaceExW")
? ? var freeBytesAvailableToCaller int64
? ? var totalNumberOfBytes int64
? ? var totalNumberOfFreeBytes int64
? ? c.Call(
? ? ? ? uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(wd))),
? ? ? ? uintptr(unsafe.Pointer(&freeBytesAvailableToCaller)),?
? ? ? ? uintptr(unsafe.Pointer(&totalNumberOfBytes)),?
? ? ? ? uintptr(unsafe.Pointer(&totalNumberOfFreeBytes))
? ? )
? ? print(freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfBytes)
}
- 3 回答
- 0 關注
- 230 瀏覽
添加回答
舉報