Rust中无法设置文件权限问题求助
问题分析与修复
你的代码权限设置失败的核心原因是:你修改的是文件权限的副本,而非实际文件的权限。
在set_permissions函数中,f.as_ref().unwrap().metadata().unwrap().permissions()返回的是Permissions结构体的一个拷贝,你对这个拷贝调用set_mode(0x777)只是修改了内存中的临时值,并没有将修改同步到磁盘上的文件。
修复方案
方案1:通过File对象写入修改后的权限
修改set_permissions函数,先获取权限副本,修改后再通过File::set_permissions写回文件:
fn set_permissions(f: Result<File, std::io::Error>) { let file = f.as_ref().unwrap(); let mut permissions = file.metadata().unwrap().permissions(); permissions.set_mode(0o777); // 用八进制表示权限更符合Unix习惯,和0x777数值等价 file.set_permissions(permissions).unwrap(); }
方案2:直接通过文件路径设置权限(更简洁)
不需要持有File对象,直接用文件路径调用fs::set_permissions,代码更直观:
use std::fs::{File, self}; use std::io::Write; use std::os::unix::prelude::PermissionsExt; use std::env; use std::path::{Path, PathBuf}; fn main() { let out_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap(); let dest_path: PathBuf = Path::new(&out_dir).join("target/release/Settings.toml"); println!("{:?}", dest_path.as_os_str()); let f = File::create(&dest_path).unwrap(); f.write_all("largest_number = 7".as_bytes()).unwrap(); // 直接通过路径设置权限 fs::set_permissions(&dest_path, fs::Permissions::from_mode(0o777)).unwrap(); }
额外建议
- 权限数值推荐用**八进制
0o777**而非十六进制0x777,这是Unix权限的标准写法,可读性更强。 - 实际开发中建议避免过度使用
unwrap(),改用match或?处理错误,让程序更健壮。
内容的提问来源于stack exchange,提问作者Vinay Joseph
相关产品推荐
相关产品推荐

