gpt4 book ai didi

rust - 如何检查文件是否在 Rust 中具有特定模式?

转载 作者:行者123 更新时间:2023-11-29 07:59:31 24 4
gpt4 key购买 nike

我希望它能工作:

use std::fs::OpenOptions;
use std::os::unix::fs::{OpenOptionsExt, PermissionsExt};

const MODE: u32 = 0o700;

fn main() {
let f = OpenOptions::new()
.write(true)
.create_new(true)
.mode(MODE)
.open("myfile")
.unwrap();
let f_mode = f.metadata().unwrap().permissions().mode();
assert_eq!(f_mode, MODE);
}

运行时,我得到:

thread 'main' panicked at 'assertion failed: `(left == right)`
left: `33216`,
right: `448`', src/main.rs:14:5

如果我检查 ls 的输出:

$ ls -al myfile 
-rwx------ 1 edd edd 0 Apr 26 14:50 myfile

很明显,一旦提交到文件系统,模式字段中就会编码一些其他信息。

除了在八进制表示的基础上使用按位运算符(屏蔽不相关的部分)之外,是否有检查文件是否为 -rwx------ 的好方法?

最佳答案

如果您要使用操作系统特定权限的低级原语,您需要处理这些细节:

#define S_IFMT   0170000  /* type of file */
#define S_IFIFO 0010000 /* named pipe (fifo) */
#define S_IFCHR 0020000 /* character special */
#define S_IFDIR 0040000 /* directory */
#define S_IFBLK 0060000 /* block special */
#define S_IFREG 0100000 /* regular */
#define S_IFLNK 0120000 /* symbolic link */
#define S_IFSOCK 0140000 /* socket */
#define S_IFWHT 0160000 /* whiteout */
#define S_ISUID 0004000 /* set user id on execution */
#define S_ISGID 0002000 /* set group id on execution */
#define S_ISVTX 0001000 /* save swapped text even after use */
#define S_IRUSR 0000400 /* read permission, owner */
#define S_IWUSR 0000200 /* write permission, owner */
#define S_IXUSR 0000100 /* execute/search permission, owner */

当您获得模式时,您还会获得有关文件类型的信息。在这里,你有 S_IFREG | S_IRUSR | S_IWUSR | S_IXUSR.

按位执行 AND 是最简单的解决方法:

assert_eq!(f_mode & 0o777, MODE);

当然,您可以在扩展特征中创建自己的访问器函数并实现它们以具有良好的意义,或者可能有一个已经这样做的 crate 。

关于rust - 如何检查文件是否在 Rust 中具有特定模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50044956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com