web-dev-qa-db-ja.com

Goを使用して空きディスク容量を取得します

基本的に、空き容量とボリュームの合計サイズの両方を含むdf -hの出力が必要です。このソリューションは、Windows、Linux、およびMacで動作し、Goで記述されている必要があります。

ossyscall Goのドキュメントを調べましたが、何も見つかりませんでした。 Windowsでは、コマンドラインユーティリティでさえ扱いにくい(dir C:\)か、昇格された特権(fsutil volume diskfree C:\)が必要です。確かに私がまだ見つけていないこれを行う方法があります...

更新:
nemoの回答と招待に従って、これを行う クロスプラットフォームのGoパッケージ を提供しました。

22
Rick Smith

POSIXシステムでは、 syscall.Statfs
現在の作業ディレクトリのバイト単位で空き領域を出力する例:

import "syscall"
import "os"

var stat syscall.Statfs_t

wd, err := os.Getwd()

syscall.Statfs(wd, &stat)

// Available blocks * size per block = available space in bytes
fmt.Println(stat.Bavail * uint64(stat.Bsize))

Windowsの場合は、syscallルートも使用する必要があります。例( ソース ):

h := syscall.MustLoadDLL("kernel32.dll")
c := h.MustFindProc("GetDiskFreeSpaceExW")

var freeBytes int64

_, _, err := c.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(wd))),
    uintptr(unsafe.Pointer(&freeBytes)), nil, nil)

クロスプラットフォームの機能を提供するパッケージを自由に作成してください。クロスプラットフォームで何かを実装する方法については、 ビルドツールのヘルプページ を参照してください。

45
nemo