跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Rust

Rust 获取系统内存 CPU 信息并实现图片采集设置壁纸

综述由AI生成介绍使用 Rust 编程语言获取系统内存、CPU、磁盘及网络信息的方法。通过 sysinfo 库实现系统监控程序,解决版本 API 变更问题。此外,结合 reqwest 和 wallpaper 库,实现了自动下载必应每日壁纸并设置为系统桌面的功能,展示了 Rust 在系统级操作中的应用。

协议工匠发布于 2026/3/30更新于 2026/5/2831 浏览
Rust 获取系统内存 CPU 信息并实现图片采集设置壁纸

系统信息

本文介绍使用 Rust 编程语言获取系统基本信息的功能,直接通过代码体验。

使用 sysinfo 库

首先在 Cargo.toml 中添加依赖:

[dependencies]
sysinfo = "0.29"

运行 cargo run。

sysinfo 库报错提示

在新版本中,global_cpu_usage() 方法已被移除。需要使用 ProcessExt trait 来使用 memory() 方法。

完成报错代码修改后,下面是完整可运行的代码。

系统信息代码

完成代码如下:

use sysinfo::{System, SystemExt, CpuExt, DiskExt, NetworkExt, ProcessExt};

fn main() {
    let mut sys = System::new_all();
    // 刷新所有信息
    sys.refresh_all();

    // 内存信息
    println!("=== 内存信息 ===");
    println!("总内存:{} MB", sys.total_memory() / 1024 / 1024);
    println!("已用内存:{} MB", sys.used_memory() / 1024 / 1024);
    println!("可用内存:{} MB", sys.available_memory() / 1024 / 1024);
    println!("总交换空间:{} MB", sys.total_swap() / 1024 / 1024);
    println!("已用交换空间:{} MB", sys.used_swap() / 1024 / 1024);

    // CPU 信息
    println!("\n=== CPU 信息 ===");
    println!("CPU 数量:{}", sys.cpus().len());

    // 计算全局 CPU 使用率的方法
    let global_cpu_usage = if !sys.cpus().is_empty() {
        sys.cpus()
            .iter()
            .map(|cpu| cpu.cpu_usage())
            .sum::<f32>()
            / sys.cpus().len() as f32
    } else {
        0.0
    };
    println!("全局 CPU 使用率:{:.1}%", global_cpu_usage);

    // 显示每个 CPU 核心的使用率
    for (i, cpu) in sys.cpus().iter().enumerate() {
        println!("CPU {}: {:.1}%", i, cpu.cpu_usage());
    }

    // 系统信息
    println!("\n=== 系统信息 ===");
    println!("系统名称:{:?}", sys.name());
    println!("内核版本:{:?}", sys.kernel_version());
    println!("OS 版本:{:?}", sys.os_version());
    println!("主机名:{:?}", sys.host_name());

    // 磁盘信息
    println!("\n=== 磁盘信息 ===");
    for disk in sys.disks() {
        println!(
            "磁盘:{:?} 总大小:{} GB 可用:{} GB",
            disk.name(),
            disk.total_space() / 1024 / 1024 / 1024,
            disk.available_space() / 1024 / 1024 / 1024
        );
    }

    // 网络信息
    println!("\n=== 网络信息 ===");
    for (interface_name, data) in sys.networks() {
        println!(
            "{}: 接收 {} MB, 发送 {} MB",
            interface_name,
            data.received() / 1024 / 1024,
            data.transmitted() / 1024 / 1024
        );
    }

    // 进程信息 - 修正部分
    println!("\n=== 进程信息 ===");
    println!("进程数量:{}", sys.processes().len());

    // 显示前 5 个内存使用最多的进程
    let mut processes: Vec<_> = sys.processes().values().collect();
    processes.sort_by(|a, b| b.memory().cmp(&a.memory()));
    for process in processes.iter().take(5) {
        println!(
            "PID: {} 名称:{:?} 内存:{} MB",
            process.pid(),
            process.name(),
            process.memory() / 1024 / 1024
        );
    }
}
系统信息运行效果

在这里插入图片描述

在这里插入图片描述

推荐使用 sysinfo 库,因为它功能全面、文档完善,并且在所有主要平台上都能良好工作。

实时监控程序

通过上面可以获取到系统基本信息后,那么就可以做一个简单的实时监控,查看系统整体运行情况的程序,类似一个任务管理器一样。

实时监控常见报错

这个错误是因为 refresh_cpu_usage() 方法在新版本中已被移除。正确的做法是使用 refresh_cpu()。

这个错误是因为 uptime() 是实例方法,不是静态方法。需要从系统实例调用。

实时监控代码

完成代码如下:

use std::{thread, time::Duration};
use sysinfo::{System, SystemExt, CpuExt, ProcessExt};

fn monitor_system() {
    let mut sys = System::new_all();
    loop {
        // 刷新系统信息
        sys.refresh_cpu();
        thread::sleep(Duration::from_secs(1));
        sys.refresh_memory();
        sys.refresh_processes();

        // 清屏并显示信息
        println!("\x1B[2J\x1B[1;1H");

        println!("=== 系统实时监控 ===");
        println!("更新时间:{:?}", sys.uptime());

        // 内存信息
        println!("\n=== 内存信息 ===");
        println!("总内存:{:>6} MB", sys.total_memory() / 1024 / 1024);
        println!("已用内存:{:>6} MB", sys.used_memory() / 1024 / 1024);
        println!("可用内存:{:>6} MB", sys.available_memory() / 1024 / 1024);
        println!(
            "使用率:{:>6.1}%",
            (sys.used_memory() as f64 / sys.total_memory() as f64) * 100.0
        );

        // CPU 信息
        println!("\n=== CPU 信息 ===");
        let global_cpu_usage = if !sys.cpus().is_empty() {
            sys.cpus()
                .iter()
                .map(|cpu| cpu.cpu_usage())
                .sum::<f32>()
                / sys.cpus().len() as f32
        } else {
            0.0
        };
        println!("CPU 核心数:{}", sys.cpus().len());
        println!("全局使用率:{:.1}%", global_cpu_usage);

        // 显示每个 CPU 核心的使用率柱状图
        for (i, cpu) in sys.cpus().iter().enumerate() {
            let usage = cpu.cpu_usage();
            let bars = (usage / 5.0) as usize;
            let bar = "=".repeat(bars.min(20));
            let spaces = " ".repeat(20 - bars.min(20));
            println!(
                "CPU {:2}: [{}{}] {:5.1}%",
                i, bar, spaces, usage
            );
        }

        // 进程信息
        println!("\n=== 内存占用前 5 的进程 ===");
        let mut processes: Vec<_> = sys.processes().values().collect();
        processes.sort_by(|a, b| b.memory().cmp(&a.memory()));
        println!("{:<6} {:<20} {:<10}", "PID", "进程名", "内存 (MB)");
        println!("{}", "-".repeat(40));
        for process in processes.iter().take(5) {
            println!(
                "{:<6} {:<20} {:<10}",
                process.pid(),
                process.name(),
                process.memory() / 1024 / 1024
            );
        }

        // 系统信息
        println!("\n=== 系统信息 ===");
        println!("系统运行时间:{} 秒", sys.uptime());
        println!("进程总数:{}", sys.processes().len());
        println!("\n按 Ctrl+C 退出监控...");

        // 等待 2 秒后刷新
        thread::sleep(Duration::from_secs(2));
    }
}

fn main() {
    println!("启动系统监控...");
    println!("按 Ctrl+C 可以退出程序");
    thread::sleep(Duration::from_secs(2));
    monitor_system();
}
实时监控运行效果

在这里插入图片描述

壁纸操作

添加依赖

actix-web = "4.4"
reqwest = { version = "0.11", features = ["blocking", "json"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
chrono = { version = "0.4", features = ["serde"] }
image = "0.24"
wallpaper = "3"
dirs = "4.0"

下面的错误表示 wallpaper 当前的版本不存在,并且还给出了建议。

设置好正确的版本后,保存,然后 cargo run 运行后会自动下载依赖。

完整代码

use std::fs::File;
use std::io::copy;
use std::path::PathBuf;
use dirs::picture_dir;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("开始获取必应每日壁纸...");

    // 1. 获取必应图片 URL
    let image_url = get_bing_image_url()?;
    println!("获取到图片 URL: {}", image_url);

    // 2. 下载图片
    let image_path = download_image(&image_url)?;
    println!("图片已下载到:{:?}", image_path);

    // 3. 设置为壁纸
    set_wallpaper(&image_path)?;
    println!("壁纸设置成功!");
    Ok(())
}

fn get_bing_image_url() -> Result<String, Box<dyn std::error::Error>> {
    // 必应每日图片 API
    let api_url = "https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN";
    let response = reqwest::blocking::get(api_url)?;
    let json: serde_json::Value = response.json()?;

    // 解析 JSON 获取图片 URL
    if let Some(images) = json["images"].as_array() {
        if let Some(first_image) = images.get(0) {
            if let Some(url) = first_image["url"].as_str() {
                let full_url = format!("https://cn.bing.com{}", url);
                return Ok(full_url);
            }
        }
    }
    Err("无法解析必应图片 URL".into())
}

fn download_image(url: &str) -> Result<PathBuf, Box<dyn std::error::Error>> {
    // 创建响应
    let response = reqwest::blocking::get(url)?;

    // 获取文件扩展名
    let extension = if url.contains(".jpg") || url.contains(".jpeg") {
        "jpg"
    } else if url.contains(".png") {
        "png"
    } else {
        "jpg" // 默认
    };

    // 生成文件名
    let file_name = format!(
        "bing_wallpaper_{}.{}",
        chrono::Local::now().format("%Y%m%d_%H%M%S"),
        extension
    );

    // 保存到图片目录
    let mut picture_dir = picture_dir().ok_or("无法获取图片目录")?;
    picture_dir.push("bing_wallpapers");

    // 创建目录(如果不存在)
    std::fs::create_dir_all(&picture_dir)?;
    let file_path = picture_dir.join(file_name);

    // 下载并保存文件
    let mut dest = File::create(&file_path)?;
    let mut content = std::io::Cursor::new(response.bytes()?);
    copy(&mut content, &mut dest)?;
    Ok(file_path)
}

fn set_wallpaper(image_path: &PathBuf) -> Result<(), Box<dyn std::error::Error>> {
    // 使用 wallpaper 库设置壁纸
    wallpaper::set_from_path(image_path.to_str().ok_or("无效的图片路径")?)?;

    // 设置壁纸模式(居中、平铺、拉伸等)
    wallpaper::set_mode(wallpaper::Mode::Crop)?;
    Ok(())
}

壁纸下载效果

在这里插入图片描述

上图已经提示已经下载到本地,并且设置好了壁纸,到对应文件夹目录即可看到下载好的壁纸图片。

在这里插入图片描述

壁纸设置效果

在这里插入图片描述

总结

在使用过程中,发现有些版本和当前使用的方法不一致,这点在使用时需要注意。整体来说,想要的方法和解决方案都能快速找到,只要养成了解的编程习惯和思维,很多开发语言都是相通的,上手会相对快一些。

目录

  1. 系统信息
  2. 使用 sysinfo 库
  3. sysinfo 库报错提示
  4. 系统信息代码
  5. 系统信息运行效果
  6. 实时监控程序
  7. 实时监控常见报错
  8. 实时监控代码
  9. 实时监控运行效果
  10. 壁纸操作
  11. 添加依赖
  12. 完整代码
  13. 壁纸下载效果
  14. 壁纸设置效果
  15. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端安全:核心漏洞防御与最佳实践
  • GitHub Copilot Agent Skills 深度解析:构建跨项目 AI 专属工具箱
  • CogVideoX-2b 一键 WebUI 使用体验
  • 开源 AI 编程工具对比:Superpowers 技能库与 OpenSpec 规范驱动
  • 5款开源PPT生成大模型实测对比:从ChatGPT到文心一言
  • Claude Code 与 OpenSpec 环境搭建及 AI 编码提效实测
  • Web 虚拟卡销售平台架构设计与核心实现
  • Flutter 基础组件:BottomNavigationBar 与 TabBar 多页切换
  • MCP Server 实现 Excel 表格一键生成可视化图表 HTML 报告
  • Cursor 中配置和使用 MCP 服务实战指南
  • 图形管线与渲染引擎的 C++ 架构:模块化与跨平台实践
  • 基于 Rokid 灵珠平台搭建旅游 AR 智能体实战指南
  • FPGA 驱动 TLV5618 实现双通道精密电压输出
  • AI 产品经理核心能力模型与转型路径
  • 链表区间反转实战:LeetCode 92 递归与哨兵节点详解
  • Linux 部署 RocketMQ 及公网穿透配置指南
  • Web3 前端安全:连接钱包的风险与防护
  • C++ 入门进阶:输入输出、缺省参数与函数重载
  • 基于 C++ 手写 HTTP 服务器:从请求解析到响应构建
  • 灵感画廊:基于 Stable Diffusion XL 的 AI 绘画入门指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online