获取磁盘占用情况(Linux/Mac下有效)

  1. import (
  2. "syscall"
  3. )
  4.  
  5. type DiskStatus struct {
  6. All uint64 `json:"all"`
  7. Used uint64 `json:"used"`
  8. Free uint64 `json:"free"`
  9. }
  10.  
  11. // disk usage of path/disk
  12. func DiskUsage(path string) (disk DiskStatus) {
  13. fs := syscall.Statfs_t{}
  14. err := syscall.Statfs(path, &fs)
  15. if err != nil {
  16. return
  17. }
  18. disk.All = fs.Blocks * uint64(fs.Bsize)
  19. disk.Free = fs.Bfree * uint64(fs.Bsize)
  20. disk.Used = disk.All - disk.Free
  21. return
  22. }

  

获取内存占用

  1. import (
  2. "runtime"
  3. )
  4.  
  5. type MemStatus struct {
  6. All uint32 `json:"all"`
  7. Used uint32 `json:"used"`
  8. Free uint32 `json:"free"`
  9. Self uint64 `json:"self"`
  10. }
  11.  
  12. func MemStat() MemStatus {
  13. //自身占用
  14. memStat := new(runtime.MemStats)
  15. runtime.ReadMemStats(memStat)
  16. mem := MemStatus{}
  17. mem.Self = memStat.Alloc
  18.  
  19. //系统占用,仅linux/mac下有效
  20. //system memory usage
  21. sysInfo := new(syscall.Sysinfo_t)
  22. err := syscall.Sysinfo(sysInfo)
  23. if err == nil {
  24. mem.All = sysInfo.Totalram * uint32(syscall.Getpagesize())
  25. mem.Free = sysInfo.Freeram * uint32(syscall.Getpagesize())
  26. mem.Used = mem.All - mem.Free
  27. }
  28. return mem
  29. }

  

后记

  1. 很明显,Windows下的支持是最弱的, 当然,还能通过调用win32 API的方式获取缺失的信息
  2. Golang的API并非完全跨平台, 正如上述的syscall.Statfs_t结构体,在Windows下是没有的

2019年1月6号更新,windows下获取磁盘空间的方法

通过调用win32 api

  1. func main() {
  2. kernel32, err := syscall.LoadLibrary("Kernel32.dll")
  3. if err != nil {
  4. log.Panic(err)
  5. }
  6. defer syscall.FreeLibrary(kernel32)
  7. GetDiskFreeSpaceEx, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GetDiskFreeSpaceExW")
  8.  
  9. if err != nil {
  10. log.Panic(err)
  11. }
  12.  
  13. lpFreeBytesAvailable := int64(0)
  14. lpTotalNumberOfBytes := int64(0)
  15. lpTotalNumberOfFreeBytes := int64(0)
  16. r, a, b := syscall.Syscall6(uintptr(GetDiskFreeSpaceEx), 4,
  17. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("C:"))),
  18. uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
  19. uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),
  20. uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)), 0, 0)
  21.  
  22. log.Printf("Available %dmb", lpFreeBytesAvailable/1024/1024.0)
  23. log.Printf("Total %dmb", lpTotalNumberOfBytes/1024/1024.0)
  24. log.Printf("Free %dmb", lpTotalNumberOfFreeBytes/1024/1024.0)
  25. }

  或者更简单的版本

  1. func main() {
  2. h := syscall.MustLoadDLL("kernel32.dll")
  3. c := h.MustFindProc("GetDiskFreeSpaceExW")
  4. lpFreeBytesAvailable := int64(0)
  5. lpTotalNumberOfBytes := int64(0)
  6. lpTotalNumberOfFreeBytes := int64(0)
  7. r2, _, err := c.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("F:"))),
  8. uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
  9. uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),
  10. uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)))
  11. }

  

2013年4月6号更新,windows下获取磁盘空间的方法

通过调用win32 api

在Golang中获取系统的磁盘空间内存占用的更多相关文章

  1. java中获取系统属性以及环境变量

    java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...

  2. Android中获取系统上安装的APP信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...

  3. Linux中删除文件,磁盘空间未释放问题追踪

    在客户使用我们产品后,发现一个问题:在删除了文件后.磁盘空间却没有释放.是有进程在打开这个文件,还是其它情况?我们一起来看看一下两个场景 一. 场景一:进程打开此文件 当一个文件正在被一个进程使用时. ...

  4. golang 中获取字符串个数

    golang 中获取字符串个数 在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数 // ...

  5. Linux 命令 - df: 报告磁盘空间的占用情况

    df 命令列出指定的文件名所在的文件系统上可用磁盘空间的数量. 如果没有指定文件名,则显示当前所有使用中的文件系统.默认情况下,磁盘空间以 1K 为一块显示,如果设置了环境变量 POSIXLY_COR ...

  6. WPF 属性系统 依赖属性之内存占用分析

    关于WPF的属性系统园子内有不少这方面的文章.里面大都提到了WPF依赖属性的在内存方面的优化.但是里面大都一笔带过.那么WPF到底是怎么样节约内存的.我们通过WPF属性和普通的CLR属性对比来看一下W ...

  7. Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)

    本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...

  8. Linux中VMware虚拟机增加磁盘空间的扩容操作

    用VMwareware虚拟机安装的Red Hat Enterprise Linux系统剩余空间不足,造成软件无法正常安装.如果重新装一遍系统就需要重新配置好开发环境和软件的安装配置.通过上网搜集的资料 ...

  9. VC++编程中获取系统时间

    <span style="white-space:pre"> </span>总结了在程序中如何获得系统时间的方法 void CGetSystenTimeDl ...

随机推荐

  1. 关于JavaScript对象,你所不知道的事(一)- 先谈对象

    这篇博文的主要目的是为了填坑,很久之前我发表了一篇名为关于JavaScript对象中的一切(一) - 对象属性的文章,想要谈一谈JavaScript对象,可那时只是贴了一张关于这个主题的思维导图,今天 ...

  2. openwrt下如何只编译linux内核

    答:make target/linux/install V=s (此操作也会将最终镜像打包好,V=s会输出日志) 拓展 清空内核: make target/linux/clean V=s 解压内核: ...

  3. 爬虫之xpath

    什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...

  4. LeetCode——minimum-path-sum

    Question Given a m x n grid filled with non-negative numbers, find a path from top left to bottom ri ...

  5. Leetcode——Third Maximum Number

    Question Given a non-empty array of integers, return the third maximum number in this array. If it d ...

  6. Hive -hivevar 参数传递

    命令行模式,或者说目录模式,可以使用hive 执行命令. 选项说明: -e : 执行短命令 -f :  执行文件(适合脚本封装) -S : 安静模式,不显示MR的运行过程 -hivevar : 传参数 ...

  7. Android6.0------权限管理

    此博客主要谈谈Android6.0的权限,关于其他6.0的知识 请看https://developer.android.com/about/versions/marshmallow/android-6 ...

  8. 修改linux系统用户最大线程数限制

    linux系统对线程数量有个最大限制,当达到系统限制的最大线程数时使用账号密码ssh到系统时是无法登陆的,会报Write failed: Broken pipe,或者是shell request fa ...

  9. 2-2-sshd服务安装管理及配置文件理解和安全调优

    大纲: 1. 培养独自解决问题的能力 2. 学习第二阶段Linux服务管理的方法 3. 安装sshd服务 4. sshd服务的使用 5. sshd服务调优 6. 初步介绍sshd配置文件 ###### ...

  10. grub2 windows版安装

    一.BIOS方式,grub2安装 查看磁盘情况 E:\grub-2.02-for-windows>wmic diskdrive list brief Caption DeviceID Model ...