如何用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()) } }
疑问与解答
是否有办法获取访问该最近文件夹的权限?
直接调整权限没用,因为你访问的Recent是Shell虚拟文件夹,并非真实的文件系统目录,普通fs模块的文件系统API无法直接访问它。真实的最近文件存储路径是C:\Users\xx\AppData\Roaming\Microsoft\Windows\Recent,不过这里存储的是快捷方式(.lnk文件),而非原文件。是否存在能直接获取最近文件的API?如何启用/禁用快速访问显示最近文件?
- 可以通过Windows Shell API获取最近文件:使用
SHGetKnownFolderPath配合FOLDERID_Recent获取真实存储路径,再枚举其中的快捷方式;也可以用IShellFolder接口直接枚举虚拟文件夹里的项。 - 启用/禁用“快速访问显示最近文件”可通过修改注册表:在
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced下,设置ShowRecent值为1(启用)或0(禁用),用windowscrate可以操作注册表实现。
- 如何用Rust实现C#代码的相同效果?
C#的Environment.SpecialFolder.Recent本质是调用了Windows的SHGetKnownFolderPathAPI,Rust中可以用windowscrate实现相同逻辑,示例代码如下:
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
相关产品推荐
相关产品推荐

