गो

2013-11-20 8 views
13

का उपयोग कर मुक्त डिस्क स्थान प्राप्त करें मूल रूप से मैं df -h का आउटपुट चाहता हूं, जिसमें खाली स्थान और वॉल्यूम के कुल आकार दोनों शामिल हैं। समाधान को विंडोज, लिनक्स और मैक पर काम करने की ज़रूरत है और गो में लिखा जाना चाहिए।गो

मैंने os और syscall पर दस्तावेज़ों को देखा है और कुछ भी नहीं मिला है। विंडोज़ पर, कमांड लाइन यूटिल्स भी अजीब हैं (dir C:\) या उन्नत विशेषाधिकारों की आवश्यकता है (fsutil volume diskfree C:\)। निश्चित रूप से वहाँ यह है कि मैं अभी तक नहीं मिला है करने के लिए एक तरीका है ...

अद्यतन:
प्रति निमो के जवाब और निमंत्रण, मैं एक cross-platform Go package कि यह करता है प्रदान की है।

+0

मुझे बस इतना मिला है कि आप [सीजीओ] (http://blog.golang.org/c-go-cgo) के साथ सी को छोड़ सकते हैं: 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 मुफ्त प्रश्न प्राप्त करने के लिए/प्रश्न/39 9 2171/कैसे-करें-i-programmatically-get-the-free-disk-space-for-a-directory-in-linux)। विस्तृत पोस्ट के लिए – twotwotwo

उत्तर

27

पॉज़िक्स सिस्टम पर आप 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 मार्ग से जाने के लिए और साथ ही जरूरत है। उदाहरण (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