編輯:@abhink指出,沒有調用Size()
。如何正確地獲取塊設備的尺寸?
我試了兩種不同的去法,然後再比較df
。當然,所有3給出不同的結果:
package main
import (
"os"
"syscall"
"fmt"
)
func main() {
disk := "/dev/sda1"
statout, err := os.Stat(disk)
if err != nil {
fmt.Errorf("Error %x", err)
os.Exit(1)
}
println("os.Stat Size : ", statout.Size())
var stat syscall.Statfs_t
syscall.Statfs(disk, &stat)
println("syscall.Statfs_t Type: ", stat.Type)
println("syscall.Statfs_t Bsize: ", stat.Bsize)
println("syscall.Statfs_t Blocks: ", stat.Blocks)
}
運行程序:
$ main
os.Stat Size : 0
syscall.Statfs_t Type: 16914836
syscall.Statfs_t Bsize: 4096
syscall.Statfs_t Blocks: 2560
和DF:
$ df /dev/sda1
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 65792556 43694068 18726712 70% /var
網:
os.Stat()
給0
它不是,但可能是一個OS問題。syscall.Statfs()
給出2560塊* 4096塊大小=10,485,760
。更現實的,但仍然不正確df
給65792556 1K塊* 1024個字節/ K =67,371,577,344
如何可靠地獲得一個塊設備的大小,而不安裝呢?
本質上,我正在尋找相當於設備上的ioctl
呼叫。
ioctl(fd,BLKGETSIZE64,&size)
'os.Stat'返回'os.FileInfo'類型,是一個接口類型。 'Size'是返回類型的方法,而不是字段。 '0xc420031f58'是函數'Size'的地址。 https://golang.org/pkg/os/#FileInfo – abhink
旁註:'fmt.Errorf'不是你所想的那樣。就像打印os.FileInfos Size字段一樣。如何查找所有使用的函數/方法的文檔? – Volker
哦,哎呀。我應該做'Size()'。很好的接收。 – deitch