2013-11-20 34 views
13

基本的に空き容量とボリュームの合計サイズの両方を含むdf -hの出力が必要です。ソリューションは、Windows、Linux、Macで動作し、Goで書かれている必要があります。Goを使用して空きディスク容量を取得

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

UPDATE:ニモの答えと招待パー
、私はこれを行うcross-platform Go packageを提供してきました。

+0

私が持っているのは、[cgo](http://blog.golang.org/c-go-cgo)でCにドロップできることです:freespace_windows.goとfreespace_ {linux、bsd} .goを書きます[GetDiskFreeSpace](http://msdn.microsoft.com/en-us/library/windows/desktop/aa364935(v = vs.85).aspx)と[statvfs](http://stackoverflow.com)を使用してください。/questions/3992171/how-do-i-programmatically-get-the-free-disk-for-a-directory-in-linux)を使用して空きスペースを確保します。 – twotwotwo

答えて

27

POSIXシステムでは、syscall.Statfsを使用できます。現在の作業ディレクトリのバイト単位の空き領域を印刷する
例:Windowsの場合

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)) 

あなたにもシステムコールのルートを移動する必要があります。例(source):

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) 

は機能、クロスプラットフォームを提供し、パッケージを書くこと自由に感じています。 クロスプラットフォームを実装する方法については、build tool help pageを参照してください。

+2

詳細なポストをありがとう。私はこれを行う私のパッケージへのリンクを含めるように私の質問を更新しました。 –

+0

共有ありがとう:) – nemo

+0

'stat.Bavail'と' stat.Bfree'の違いを知っていますか?ここに文書化されています:https://golang.org/pkg/syscall/#Statfs_t – bantl23

関連する問題