在Windows
下编写的,Linux
相关的那段代码无法通过编译,提示"Unresolved type 'Statvfs_t'"
加了判断根据系统调用不同的函数,也不行吗?
那要怎么解决?
//go:build windows || linux
package main
import (
"fmt"
"golang.org/x/sys/windows"
"os"
"runtime"
"syscall"
)
// 获取磁盘的可用空间。依次为 可用空间、总空间、剩余空间(包含系统保留)
//
// 参考 https://stackoverflow.com/a/60724929
func get() (free uint64, total uint64, avail uint64, err error) {
wd, err := os.Getwd()
if err != nil {
return
}
switch runtime.GOOS {
case "windows":
pathPtr, err := windows.UTF16PtrFromString(wd)
if err != nil {
return
}
err = windows.GetDiskFreeSpaceEx(pathPtr, &free, &total, &avail)
if err != nil {
return
}
case "linux":
var stat syscall.Statvfs_t
if err := syscall.Statvfs(wd, &stat); err != nil {
fmt.Println(err)
return
}
// 块大小 = fragment 大小 * fragment 个数(单位为字节)
blockSize := uint64(stat.Frsize)
// 可用空间 = 块大小 * 可用块数(单位为字节)
free = stat.F_bfree * blockSize
// 总空间 = 块大小 * 总块数(单位为字节)
total = stat.F_blocks * blockSize
// 剩余空间 = 块大小 * 剩余块数(单位为字节)
avail = stat.F_bavail * blockSize
default:
return 0, 0, 0, fmt.Errorf("未适配的平台'%s'", runtime.GOOS)
}
return
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.