博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Golang中获取系统的磁盘空间内存占用
阅读量:6692 次
发布时间:2019-06-25

本文共 2784 字,大约阅读时间需要 9 分钟。

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

import (    "syscall") type DiskStatus struct {    All  uint64 `json:"all"`    Used uint64 `json:"used"`    Free uint64 `json:"free"`} // disk usage of path/diskfunc 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}

  

后记

  1. 很明显,Windows下的支持是最弱的, 当然,还能通过调用win32 API的方式获取缺失的信息
  2. 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

转载于:https://www.cnblogs.com/dfsxh/p/10329380.html

你可能感兴趣的文章
从此不再惧怕URI编码:JavaScript及C# URI编码详解
查看>>
[OpenGL] glVertexAttribPointer函数与glVertexAttribIPointer函数使用中遇到的小坑(int类型被自动转换为float类型)...
查看>>
oracle添加控制文件,ORA-00214: 错误
查看>>
SQL 语句技巧--单列数据变多行数据
查看>>
MySQL数据库机房裁撤问题总结
查看>>
获取图片为二进制流,并且显示图片到网页
查看>>
C#获取当前程序运行路径的方法集合
查看>>
Android IOS WebRTC 音视频开发总结(三二)-- WebRTC项目开发建议
查看>>
Azure 中的多个 VM NIC 和网络虚拟设备
查看>>
Tensorflow生成唐诗和歌词(上)
查看>>
HRBUST 1326 循环找父节点神术
查看>>
[转载]android 显示多选列表对话框setMultiChoiceItems
查看>>
SVN Cleanup failed to process the following paths错误的解决
查看>>
使用button的:after伪类选择器内容的跳动
查看>>
Java从小白到入门,Day8,JAVAOO-多态
查看>>
CSS之各种居中
查看>>
poj 2594 Treasure Exploration
查看>>
bzoj千题计划297:bzoj3629: [JLOI2014]聪明的燕姿
查看>>
iOS简单实现毛玻璃效果
查看>>
maven学习(5)-Maven 聚合与继承特性
查看>>