2013-11-20 18 views
13

Grundsätzlich möchte ich die Ausgabe von df -h, die sowohl den freien Speicherplatz und die Gesamtgröße des Volumes enthält. Die Lösung muss unter Windows, Linux und Mac funktionieren und in Go geschrieben sein.Get Menge von freiem Speicherplatz mit Go

Ich habe durch die os und syscall Go Dokumentation gesucht und nichts gefunden. Unter Windows sind sogar Befehlszeilenprogramme entweder umständlich (dir C:\) oder benötigen erhöhte Rechte (fsutil volume diskfree C:\). Sicherlich gibt es eine Möglichkeit, dies zu tun, die ich noch nicht ...

UPDATE gefunden haben:
Per nemo Antwort und Einladung habe ich eine cross-platform Go package vorgesehen, das dies tut.

+0

Alles, was ich habe, ist, dass Sie mit [cgo] (http://blog.golang.org/c-go-cgo) auf C setzen können: schreiben Sie freespace_windows.go und freespace_ {linux, bsd} .go , und verwenden Sie [GetDiskFreeSpace] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364935 (v = V.85) .aspx) und [statvfs] (http://stackoverflow.com)/questions/3992171/how-do-i-programmatically-erhalten-die-freie-Speicherplatz-für-ein-Verzeichnis-in-Linux), um freien Speicherplatz zu erhalten. – twotwotwo

Antwort

27

Auf POSIX-Systemen können Sie syscall.Statfs verwenden.
Beispiel in Bytes aktuellen Arbeitsverzeichnis Freiraum Druck:

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

Für Windows müssen Sie auch den syscall Weg zu gehen. Beispiel (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) 

Sie können ferner ein Paket zu schreiben, die die Funktionalität Cross-Plattform zur Verfügung stellt. Informationen zur plattformübergreifenden Implementierung finden Sie unter build tool help page.

+2

Danke für den ausführlichen Beitrag. Ich habe meine Frage aktualisiert, um den Link zu meinem Paket hinzuzufügen, das dies tut. –

+0

Danke für das Teilen :) – nemo

+0

Kennen Sie den Unterschied zwischen 'stat.Bavail' und' stat.Bfree'? Dokumentiert hier: https://golang.org/pkg/syscall/#Statfs_t – bantl23

Verwandte Themen