4个版本

0.1.3 2020年8月5日
0.1.2 2020年8月5日
0.1.1 2020年8月5日
0.1.0 2020年8月5日

#13#unix-file

32 每月下载
4 个crate中(直接使用2个)使用

GPL-3.0-or-later

110KB
741

可读Unix权限

UNIX文件权限模型的数据类型。可转换为和从 mode_t

用法

Crate旨在提供对mode_t更精细和更合理的控制,因此有多个使用Permissions结构体的方式。

以下所有函数都是nightly上的const fn

从模式创建

let perms = Permissions::from_mask(0o644); // Any value above 0u777 is truncated.

通过构建器模式创建

您可以使用add_mask()添加掩码

let perms = Permissions::new()
	.add_mask(User::Owner, Bit::Read | Bit::Write)
	.add_mask(User::Group, Bit::Read);

并使用remove_mask()移除它们

let perms = Permissions::from_mask(0o777)
	.remove_mask(User::Other, Bit::Write | Bit::Execute)
	.remove_mask(User::Group, Bit::Write);

检查

您可以使用has_mask()检查哪些模式被设置。

let perms = Permissions::from_mask(0o754);
assert!(perms.has_mask(User::Owner, Bit::Mask));
assert!(perms.has_mask(User::Group, Bit::Read | Bit::Execute));
assert!(perms.has_mask(User::Other, Bit::Read));

我们还派生了PartialEq<u32>,以便可以直接与mode_t进行比较。

let perms = Permissions::from_mask(0o644);

assert_eq!(perms, 0o644);

扩展特性

我们还定义了一个针对目标家族unix的扩展特性,它遵循std::os::unix::fs::PermissionsExt。有关详细信息,请参阅ext.rs

use readable_perms::PermissionsExt as UnixPermsExt;
use std::os::unix::fs::PermissionsExt;

fn do_thing(file: &mut std::fs::File)
{
	let perms = file.metadata().unwrap().permissions().unix();
	println!("Perms are {}", perms);
}

修改权限

默认功能chmod启用时,还为实现了AsRawFd的类型(如std::fs::File)和AsRef<Path>定义了扩展特性。

use readable_perms::{FChmodExt,ChmodExt};

fn mod_path<P: AsRef<Path>>(path: P)
{
	path.chmod(Permissions::from_mask(0o644)).expect("Uh oh")
}

fn mod_file(file: &mut std::fs::File)
{
	file.chmod(Permissinos::from_mask(0u777)).expect("Uh oh")
}

性能

在nightly上,大多数函数都是const fn,对常量定义没有运行时成本。在稳定版本上,则不然。无论如何,我们定义了一个全局的const查找表,以便转换的速度与内存查找一样快。

添加和移除掩码通常需要1个或2个位运算。TODO:基准测试这些?

基准测试

类型
从模式转换 每迭代159纳秒(±15)
转换为模式 每迭代162纳秒(±15)

许可证

GPLv3及以下版本

依赖项

约135KB