在Golang中获取系统的磁盘空间内存占用
获取磁盘占用情况(Linux/Mac下有效)
- import (
- "syscall"
- )
- type DiskStatus struct {
- All uint64 `json:"all"`
- Used uint64 `json:"used"`
- Free uint64 `json:"free"`
- }
- // disk usage of path/disk
- func DiskUsage(path string) (disk DiskStatus) {
- fs := syscall.Statfs_t{}
- err := syscall.Statfs(path, &fs)
- if err != nil {
- return
- }
- disk.All = fs.Blocks * uint64(fs.Bsize)
- disk.Free = fs.Bfree * uint64(fs.Bsize)
- disk.Used = disk.All - disk.Free
- return
- }
获取内存占用
- import (
- "runtime"
- )
- type MemStatus struct {
- All uint32 `json:"all"`
- Used uint32 `json:"used"`
- Free uint32 `json:"free"`
- Self uint64 `json:"self"`
- }
- func MemStat() MemStatus {
- //自身占用
- memStat := new(runtime.MemStats)
- runtime.ReadMemStats(memStat)
- mem := MemStatus{}
- mem.Self = memStat.Alloc
- //系统占用,仅linux/mac下有效
- //system memory usage
- sysInfo := new(syscall.Sysinfo_t)
- err := syscall.Sysinfo(sysInfo)
- if err == nil {
- mem.All = sysInfo.Totalram * uint32(syscall.Getpagesize())
- mem.Free = sysInfo.Freeram * uint32(syscall.Getpagesize())
- mem.Used = mem.All - mem.Free
- }
- return mem
- }
后记
- 很明显,Windows下的支持是最弱的, 当然,还能通过调用win32 API的方式获取缺失的信息
- Golang的API并非完全跨平台, 正如上述的syscall.Statfs_t结构体,在Windows下是没有的
2019年1月6号更新,windows下获取磁盘空间的方法
通过调用win32 api
- func main() {
- kernel32, err := syscall.LoadLibrary("Kernel32.dll")
- if err != nil {
- log.Panic(err)
- }
- defer syscall.FreeLibrary(kernel32)
- GetDiskFreeSpaceEx, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GetDiskFreeSpaceExW")
- if err != nil {
- log.Panic(err)
- }
- lpFreeBytesAvailable := int64(0)
- lpTotalNumberOfBytes := int64(0)
- lpTotalNumberOfFreeBytes := int64(0)
- r, a, b := syscall.Syscall6(uintptr(GetDiskFreeSpaceEx), 4,
- uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("C:"))),
- uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
- uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),
- uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)), 0, 0)
- log.Printf("Available %dmb", lpFreeBytesAvailable/1024/1024.0)
- log.Printf("Total %dmb", lpTotalNumberOfBytes/1024/1024.0)
- log.Printf("Free %dmb", lpTotalNumberOfFreeBytes/1024/1024.0)
- }
或者更简单的版本
- func main() {
- h := syscall.MustLoadDLL("kernel32.dll")
- c := h.MustFindProc("GetDiskFreeSpaceExW")
- lpFreeBytesAvailable := int64(0)
- lpTotalNumberOfBytes := int64(0)
- lpTotalNumberOfFreeBytes := int64(0)
- r2, _, err := c.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("F:"))),
- uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
- uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),
- uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)))
- }
2013年4月6号更新,windows下获取磁盘空间的方法
通过调用win32 api
在Golang中获取系统的磁盘空间内存占用的更多相关文章
- java中获取系统属性以及环境变量
java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...
- Android中获取系统上安装的APP信息
Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...
- Linux中删除文件,磁盘空间未释放问题追踪
在客户使用我们产品后,发现一个问题:在删除了文件后.磁盘空间却没有释放.是有进程在打开这个文件,还是其它情况?我们一起来看看一下两个场景 一. 场景一:进程打开此文件 当一个文件正在被一个进程使用时. ...
- golang 中获取字符串个数
golang 中获取字符串个数 在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数 // ...
- Linux 命令 - df: 报告磁盘空间的占用情况
df 命令列出指定的文件名所在的文件系统上可用磁盘空间的数量. 如果没有指定文件名,则显示当前所有使用中的文件系统.默认情况下,磁盘空间以 1K 为一块显示,如果设置了环境变量 POSIXLY_COR ...
- WPF 属性系统 依赖属性之内存占用分析
关于WPF的属性系统园子内有不少这方面的文章.里面大都提到了WPF依赖属性的在内存方面的优化.但是里面大都一笔带过.那么WPF到底是怎么样节约内存的.我们通过WPF属性和普通的CLR属性对比来看一下W ...
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...
- Linux中VMware虚拟机增加磁盘空间的扩容操作
用VMwareware虚拟机安装的Red Hat Enterprise Linux系统剩余空间不足,造成软件无法正常安装.如果重新装一遍系统就需要重新配置好开发环境和软件的安装配置.通过上网搜集的资料 ...
- VC++编程中获取系统时间
<span style="white-space:pre"> </span>总结了在程序中如何获得系统时间的方法 void CGetSystenTimeDl ...
随机推荐
- 关于JavaScript对象,你所不知道的事(一)- 先谈对象
这篇博文的主要目的是为了填坑,很久之前我发表了一篇名为关于JavaScript对象中的一切(一) - 对象属性的文章,想要谈一谈JavaScript对象,可那时只是贴了一张关于这个主题的思维导图,今天 ...
- openwrt下如何只编译linux内核
答:make target/linux/install V=s (此操作也会将最终镜像打包好,V=s会输出日志) 拓展 清空内核: make target/linux/clean V=s 解压内核: ...
- 爬虫之xpath
什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...
- 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 ...
- Leetcode——Third Maximum Number
Question Given a non-empty array of integers, return the third maximum number in this array. If it d ...
- Hive -hivevar 参数传递
命令行模式,或者说目录模式,可以使用hive 执行命令. 选项说明: -e : 执行短命令 -f : 执行文件(适合脚本封装) -S : 安静模式,不显示MR的运行过程 -hivevar : 传参数 ...
- Android6.0------权限管理
此博客主要谈谈Android6.0的权限,关于其他6.0的知识 请看https://developer.android.com/about/versions/marshmallow/android-6 ...
- 修改linux系统用户最大线程数限制
linux系统对线程数量有个最大限制,当达到系统限制的最大线程数时使用账号密码ssh到系统时是无法登陆的,会报Write failed: Broken pipe,或者是shell request fa ...
- 2-2-sshd服务安装管理及配置文件理解和安全调优
大纲: 1. 培养独自解决问题的能力 2. 学习第二阶段Linux服务管理的方法 3. 安装sshd服务 4. sshd服务的使用 5. sshd服务调优 6. 初步介绍sshd配置文件 ###### ...
- grub2 windows版安装
一.BIOS方式,grub2安装 查看磁盘情况 E:\grub-2.02-for-windows>wmic diskdrive list brief Caption DeviceID Model ...