如何检查文件是否具有 Rust 中的特定模式?
How do I check if a file has a certain mode in Rust?
我希望它能起作用:
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------
的好方法?
如果您要使用 OS 特定权限的低级原语,您需要处理这些细节:
#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
.
按位与是最简单的解决方法:
assert_eq!(f_mode & 0o777, MODE);
当然,您可以在扩展特征中创建自己的访问器函数并实现它们以具有良好的意义,或者可能有一个已经这样做的板条箱。
我希望它能起作用:
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------
的好方法?
如果您要使用 OS 特定权限的低级原语,您需要处理这些细节:
#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
.
按位与是最简单的解决方法:
assert_eq!(f_mode & 0o777, MODE);
当然,您可以在扩展特征中创建自己的访问器函数并实现它们以具有良好的意义,或者可能有一个已经这样做的板条箱。