You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Rust访问Windows最近文件夹?权限与API问题求助

Rust访问Windows“最近文件”文件夹权限问题及解决方案

我尝试编写Rust脚本删除Windows上部分最近打开的文件,已知对应文件夹可通过Win+R输入recent打开,但用以下代码直接访问时触发权限拒绝错误:Os { code: 5, kind: PermissionDenied }

use dirs::home_dir;
use std::fs;

fn main() {
    let user_folder = home_dir().unwrap();

    let recent_folder = user_folder.join("Recent");

    let recent_folder_contents = fs::read_dir(recent_folder.to_str().unwrap()).unwrap();

    println!("{}", recent_folder.display());
    
    for path in recent_folder_contents {
        println!("{}", path.unwrap().path().display())
    }
}

疑问与解答

  1. 是否有办法获取访问该最近文件夹的权限?
    直接调整权限没用,因为你访问的Recent是Shell虚拟文件夹,并非真实的文件系统目录,普通fs模块的文件系统API无法直接访问它。真实的最近文件存储路径是C:\Users\xx\AppData\Roaming\Microsoft\Windows\Recent,不过这里存储的是快捷方式(.lnk文件),而非原文件。

  2. 是否存在能直接获取最近文件的API?如何启用/禁用快速访问显示最近文件?

  • 可以通过Windows Shell API获取最近文件:使用SHGetKnownFolderPath配合FOLDERID_Recent获取真实存储路径,再枚举其中的快捷方式;也可以用IShellFolder接口直接枚举虚拟文件夹里的项。
  • 启用/禁用“快速访问显示最近文件”可通过修改注册表:在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced下,设置ShowRecent值为1(启用)或0(禁用),用windows crate可以操作注册表实现。
  1. 如何用Rust实现C#代码的相同效果?
    C#的Environment.SpecialFolder.Recent本质是调用了Windows的SHGetKnownFolderPath API,Rust中可以用windows crate实现相同逻辑,示例代码如下:
use windows::{
    core::PCWSTR,
    Win32::Shell::{SHGetKnownFolderPath, FOLDERID_Recent},
};

fn main() -> windows::core::Result<()> {
    let path = SHGetKnownFolderPath(&FOLDERID_Recent, 0, None)?;
    let path_str = path.to_string()?;
    println!("Recent folder path: {}", path_str);
    
    // 之后可以用fs模块访问这个真实路径下的内容
    Ok(())
}

需要在Cargo.toml中添加依赖:

[dependencies]
windows = { version = "0.52", features = ["Win32_Shell", "Win32_Foundation", "core"] }

内容的提问来源于stack exchange,提问作者Hellagur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:10:28