使用 Go 语言获取跨平台磁盘空间信息教程


使用 Go 语言获取跨平台磁盘空间信息教程

本教程详细介绍了如何使用 go 语言在不同操作系统(linux/macos 和 windows)上获取磁盘的空闲空间和总容量信息。通过利用 go 的 `x/sys` 扩展包,我们能直接调用底层的系统 api,从而实现对磁盘使用情况的精确查询。文章提供了针对 posix 和 windows 系统的具体代码示例,并探讨了构建跨平台解决方案的策略。

在开发跨平台应用程序时,获取操作系统层面的磁盘使用情况(例如,总容量、可用空间、已用空间)是一个常见的需求。Go 语言本身的核心库并未直接提供一个统一的跨平台接口来执行类似 df -h 的操作。然而,通过 Go 提供的 x/sys 扩展包,我们可以方便地调用不同操作系统的底层系统调用,从而实现这一功能。

1. 在 POSIX 系统 (Linux/macOS) 上获取磁盘空间

对于基于 POSIX 标准的系统,如 Linux 和 macOS,我们可以使用 golang.org/x/sys/unix 包中的 Statfs 函数来获取文件系统统计信息。这个函数会填充一个 Statfs_t 结构体,其中包含了我们需要的所有磁盘信息。

核心概念:

Manus Manus

全球首款通用型AI Agent,可以将你的想法转化为行动。

Manus 250 查看详情 Manus
  • Statfs_t.B*ail: 可供非超级用户使用的空闲块数量。
  • Statfs_t.Bsize: 每个文件系统块的大小(字节)。
  • Statfs_t.Blocks: 文件系统中的总块数。
  • Statfs_t.Bfree: 文件系统中的总空闲块数(包括为超级用户保留的块)。

通过 B*ail * Bsize 即可计算出可用的空闲字节数。

示例代码:

package main

import (
    "fmt"
    "os"

    "golang.org/x/sys/unix"
)

func getDiskUsagePOSIX(path string) (total uint64, free uint64, err error) {
    var stat unix.Statfs_t
    err = unix.Statfs(path, &stat)
    if err != nil {
        return 0, 0, fmt.Errorf("无法获取 %s 的文件系统状态: %w", path, err)
    }

    // 总字节数 = 总块数 * 每块大小
    total = stat.Blocks * uint64(stat.Bsize)
    // 可用字节数 = 可用块数 * 每块大小
    free = stat.B*ail * uint64(stat.Bsize)

    return total, free, nil
}

func main() {
    // 获取当前工作目录的磁盘使用情况
    wd, err := os.Getwd()
    if err != nil {
        fmt.Printf("获取当前工作目录失败: %v
", err)
        return
    }

    total, free, err := getDiskUsagePOSIX(wd)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Printf("POSIX 系统 (%s):
", wd)
    fmt.Printf("  总空间: %d 字节 (%.2f GB)
", total, float64(total)/(1024*1024*1024))
    fmt.Printf("  可用空间: %d 字节 (%.2f GB)
", free, float64(free)/(1024*1024*1024))
}

注意事项:

  • Statfs 函数需要一个文件系统路径作为参数,通常是挂载点或目录路径。
  • 返回的字节数是原始字节,需要进行单位转换(如除以 1024^3 转换为 GB)以提高可读性。

2. 在 Windows 系统上获取磁盘空间

对于 Windows 操作系统,我们需要使用 golang.org/x/sys/windows 包中的 GetDiskFreeSpaceEx 函数。这个函数是 Windows API 的直接封装,可以获取指定驱动器的磁盘空间信息。

核心概念:

  • GetDiskFreeSpaceEx 函数接收一个驱动器根路径(例如 "C:")作为参数。
  • 它会填充三个 uint64 类型的指针:
    • lpFreeBytesAvailable: 调用进程可用的字节数。
    • lpTotalNumberOfBytes: 驱动器上的总字节数。
    • lpTotalNumberOfFreeBytes: 驱动器上所有用户可用的总空闲字节数。

示例代码:

package main

import (
    "fmt"
    "syscall"

    "golang.org/x/sys/windows"
)

func getDiskUsageWindows(drivePath string) (total uint64, free uint64, err error) {
    var freeBytesAvailable uint64
    var totalNumberOfBytes uint64
    var totalNumberOfFreeBytes uint64

    // GetDiskFreeSpaceEx 需要以 UTF16 编码的路径
    drivePathPtr, err := syscall.UTF16PtrFromString(drivePath)
    if err != nil {
        return 0, 0, fmt.Errorf("转换路径 %s 失败: %w", drivePath, err)
    }

    err = windows.GetDiskFreeSpaceEx(
        drivePathPtr,
        &freeBytesAvailable,
        &totalNumberOfBytes,
        &totalNumberOfFreeBytes,
    )
    if err != nil {
        return 0, 0, fmt.Errorf("获取 %s 磁盘空间失败: %w", drivePath, err)
    }

    // 返回总字节数和调用进程可用的字节数
    return totalNumberOfBytes, freeBytesAvailable, nil
}

func main() {
    // 获取 C 盘的磁盘使用情况
    drive := "C:\"
    total, free, err := getDiskUsageWindows(drive)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Printf("Windows 系统 (%s):
", drive)
    fmt.Printf("  总空间: %d 字节 (%.2f GB)
", total, float64(total)/(1024*1024*1024))
    fmt.Printf("  可用空间: %d 字节 (%.2f GB)
", free, float64(free)/(1024*1024*1024))
}

注意事项:

  • GetDiskFreeSpaceEx 需要驱动器的根路径,例如 "C:" 而不是 "C:" 或 "C"。
  • 路径字符串需要通过 syscall.UTF16PtrFromString 转换为 UTF-16 指针。
  • freeBytesAvailable 是当前用户/进程可用的空间,totalNumberOfFreeBytes 是整个驱动器上的总空闲空间。根据需求选择合适的返回值。

3. 实现跨平台解决方案

为了创建一个真正的跨平台 Go 包,我们需要利用 Go 的构建约束(Build Constraints)。构建约束允许我们根据目标操作系统、架构等条件包含或排除特定的源文件。

构建约束示例:

  • // +build linux darwin:此文件仅在 Linux 和 macOS 上编译。
  • // +build windows:此文件仅在 Windows 上编译。

一个典型的跨平台包会定义一个通用的接口(例如 DiskUsage 结构体和 GetDiskUsage 函数),然后在不同的文件中实现这个接口:

  • disk_unix.go:包含 POSIX 系统的实现,顶部添加 // +build linux darwin freebsd 等。
  • disk_windows.go:包含 Windows 系统的实现,顶部添加 // +build windows。

这样,当 Go 编译器针对特定平台构建时,它会自动选择相应的实现文件。

推荐做法: 可以参考现有的一些开源 Go 包,它们已经实现了跨平台获取磁盘使用情况的功能。例如,在问题更新中提到的 ricochet2200/go-disk-usage 包就是一个很好的参考。这些包通常会提供一个简洁的 API,隐藏底层操作系统调用的复杂性。

总结

通过 Go 语言的 x/sys 扩展包,我们可以直接访问底层操作系统的 API,从而实现对磁盘空间信息的精确获取。对于 POSIX 系统,golang.org/x/sys/unix.Statfs 是首选;对于 Windows 系统,golang.org/x/sys/windows.GetDiskFreeSpaceEx 提供了所需的功能。结合 Go 的构建约束,我们可以轻松地构建出健壮且高效的跨平台磁盘空间管理工具。在实际开发中,建议封装这些底层调用,提供一个统一且易于使用的 API,以提升代码的可维护性和可移植性。

以上就是使用 Go 语言获取跨平台磁盘空间信息教程的详细内容,更多请关注其它相关文章!


# 提供一个  # 汕头网络营销推广专业  # 湖南seo排名工具  # 自己做网站做抖音推广  # 肥乡优化seo  # 唐海县网站建设  # 霸州短视频营销推广  # 宜昌网站建设网址  # 鹤壁网站排名优化报价单  # 重庆seo推广是什么  # 青岛网站建设接单  # 资源管理  # 转换为  # 它会  # 器上  # 应用程序  # linux  # 我们可以  # 文件系统  # 磁盘空间  # win  # macos  # unix  # ai  # mac  # 工具  # 字节  # 编码  # 操作系统  # golang  # windows  # go 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: iPhone17Pro如何连接蓝牙耳机_iPhone17Pro蓝牙设备配对与连接方法介绍  cad加载的线型看不见怎么办_cad线型不可见问题解决方法  《兴业银行》注册登录方法  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享  抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系  Win11怎么设置分辨率 Win11显示设置调整分辨率及刷新率修改  iPhone12是否要更新ios16  繁花漫画使用教程  《雷电模拟器》截图方法介绍  j*a中ArrayBlockingQueue的使用  芒果TV官网登录入口 芒果TV官方网站登录入口  多多买菜门店端app订单查看方法  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  Django模型动态关联检查:高效管理复杂关系  在React中正确处理HTML input type="number"的数值类型  c++如何链接Boost库_c++准标准库的集成与使用  Highcharts雷达图轴线交点数值标注指南  银信通自动开通原因揭秘  sf漫画官网登录入口直达_sf漫画官方正版网址  Composer reinstall命令重装损坏的包  猫眼app抢票快还是小程序快  search中maxlength属性用法解析  一点万象签到领积分指南  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  微博网页版访问入口 微博网页版网页端使用指南  如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现  快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  word表格如何按某一列内容进行排序_Word表格按列排序方法  win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】  Chart.js 教程:自定义插件实现图表与图例间距调整  铁路12306官网登录入口 铁路12306在线购票官方平台  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  PHP实现等比数列:构建数组元素基于前一个值递增的方法  创建您的便携版VS Code:让配置随身携带  Python模块化编程:避免循环导入与共享函数的最佳实践  大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日  菜鸟驿站的取件码忘了怎么办 手机快速查询指南  中通快递官网指定查询 中通快递单号查询平台入口  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  申通快递查询 申通物流快递单实时查询入口  猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法  手机远程连接电脑方法  优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南  实时数据流中高效查找最小值与最大值  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  123平台官方登录入口 123邮箱网页端在线沟通工具  Python测试中模块导入路径解析的最佳实践  使用Python和NLTK从文本中高效提取名词的实用教程  《新三国志曹操传》游历事件袁尚突围攻略 

 2025-11-10

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.