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个)使用
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