我的目标是禁止Unix系统中的其他用户读取文件内容。
在Linux中如何设置文件权限,同时仍允许程序编译为Windows?
编译Unix机器的程序,我可以这样做:
use std::os::unix::fs::PermissionsExt;
fs::set_permissions("/path", fs::Permissions::from_mode(0o655)).unwrap();
但是这段代码无法在Windows上编译。我该如何解决?
我的目标是禁止Unix系统中的其他用户读取文件内容。
在Linux中如何设置文件权限,同时仍允许程序编译为Windows?
编译Unix机器的程序,我可以这样做:
use std::os::unix::fs::PermissionsExt;
fs::set_permissions("/path", fs::Permissions::from_mode(0o655)).unwrap();
但是这段代码无法在Windows上编译。我该如何解决?
#[cfg(unix)]
来有条件地为Unix编译代码,而对于非Unix分支,则使用#[cfg(windows)]
或#[cfg(not(unix))]。同时链接可以参考。
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt;
fs::set_permissions("/path", fs::Permissions::from_mode(0o655))?;
}
#[cfg(not(unix))]
{
todo!();
}
您可能希望使用Rust的条件编译功能(类似于C / C ++中的ifdef
)。
您可以选择使用以下方式在特定操作系统上编译代码:
// The function is only included in the build when compiling for macOS
#[cfg(target_os = "macos")]
fn set_permissions(path: &str) {
use std::os::unix::fs::PermissionsExt;
fs::set_permissions(path, fs::Permissions::from_mode(0o655)).unwrap();
}
#[cfg(not(target_os = "macos"))]
fn set_permissions(path: &str) {
...
}
请记住,您可能需要一个空的存根使代码在其他平台上编译。
支持的值包括:"windows"、"macos"、"ios"、"linux"、"android"、"freebsd"、"dragonfly"、"openbsd"、"netbsd"。
或者您可以使用更通用的说明符,例如target_family
:
// The function is only included in the build when compile for unix systems
#[cfg(target_family = "unix")]
fn set_permissions(path: &str) {
use std::os::unix::fs::PermissionsExt;
fs::set_permissions(path, fs::Permissions::from_mode(0o655)).unwrap();
}
支持的值: "unix", "windows", "wasm"
#[cfg(target_family = "unix")]
fn set_permissions(path: &str) {
use std::os::unix::fs::PermissionsExt;
fs::set_permissions(path, fs::Permissions::from_mode(0o655)).unwrap();
}
#[cfg(not(target_family = "unix"))]
fn set_permissions(path: &str) {}
mode
方法只适用于 Unix,因此您仍需要根据 @munksgaard 等人在下面编写的条件编译。 https://dev59.com/7V4b5IYBdhLWcg3wzUYp#28673836 - Thorkil Værge