亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Windows 中獲取驅動器的總大小

如何在 Windows 中獲取驅動器的總大小

Go
MMMHUHU 2023-06-05 18:30:33
我想使用標準 Windows API 調用在 Windows 上的 Go 中獲取驅動器的總大?。晃野l現這是為了獲得可用空間?,F在我想以特殊驅動器的總空間大小為例C:\
查看完整描述

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


查看完整回答
反對 回復 2023-06-05
?
一只斗牛犬

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)

}


查看完整回答
反對 回復 2023-06-05
?
莫回無

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)

}


查看完整回答
反對 回復 2023-06-05
  • 3 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號