3 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
您鏈接的問(wèn)題+答案顯示了如何獲得可用空間。該解決方案使用 中的GetDiskFreeSpaceExW()
Windows API 函數(shù)來(lái)kernel32.dll
獲取它。
同樣的函數(shù)也可以用來(lái)獲取總大小。函數(shù)簽名GetDiskFreeSpaceExW()
:
BOOL?GetDiskFreeSpaceExW( ??LPCWSTR?????????lpDirectoryName, ??PULARGE_INTEGER?lpFreeBytesAvailableToCaller, ??PULARGE_INTEGER?lpTotalNumberOfBytes, ??PULARGE_INTEGER?lpTotalNumberOfFreeBytes );
它有一個(gè)輸入?yún)?shù),路徑,它有 3 個(gè)輸出參數(shù),即空閑字節(jié)數(shù)(可供調(diào)用者使用)、總字節(jié)數(shù)(磁盤(pán)大?。┖涂偪臻e字節(jié)數(shù)。
因此,只需在您調(diào)用它時(shí),為您想要從中獲取的所有信息提供變量(指針)。
例如:
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)
運(yùn)行它,示例輸出:
1 0 Success.
Free: 16795295744 Total: 145545281536 Available: 16795295744

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
由于系統(tǒng)調(diào)用已棄用,其他回復(fù)已過(guò)時(shí)。
您現(xiàn)在必須使用 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貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
在GetDiskFreeSpraceExW的文檔中,該函數(shù)聲明為:
BOOL GetDiskFreeSpaceExW(
? LPCWSTR? ? ? ? ?lpDirectoryName,
? PULARGE_INTEGER lpFreeBytesAvailableToCaller,
? PULARGE_INTEGER lpTotalNumberOfBytes,
? PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
因此,您可以在一次調(diào)用中獲得總大小和可用大小:
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 關(guān)注
- 221 瀏覽
添加回答
舉報(bào)