如何在所有平台上编译一个适用于Unix的文件权限方法。

4

我的目标是禁止Unix系统中的其他用户读取文件内容。

在Linux中如何设置文件权限,同时仍允许程序编译为Windows?

编译Unix机器的程序,我可以这样做:

use std::os::unix::fs::PermissionsExt;
fs::set_permissions("/path", fs::Permissions::from_mode(0o655)).unwrap();

但是这段代码无法在Windows上编译。我该如何解决?


值得注意的是,如果可能的话,最好使用正确的权限创建文件。可以按照下面链接中所述完成此操作。但是 mode 方法只适用于 Unix,因此您仍需要根据 @munksgaard 等人在下面编写的条件编译。 https://dev59.com/7V4b5IYBdhLWcg3wzUYp#28673836 - Thorkil Værge
3个回答

4
使用#[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!();
}

2

您可能希望使用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"


1
最简单的处理方法可能是通过配置属性实现。
例如,您可能希望像这样设置一些内容:
#[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) {} 

更多示例在这里,参考文档在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接