使用 Rust 显示文件元数据,例如所有者和组

Bas*_*sur 1 linux rust

我正在进行递归文件搜索并使其能够使用简单的权限,但我无法确定如何获取文件夹或文件的所有者(所有者 ID)或组(组 ID)。我发现了如何获取文件或文件夹的当前权限。我得到一个 uint_32,所以其中大约 9 位用于保存权限。但是时间戳保存在哪里以及如何保存呢?和主人?在我的研究中,我了解到 Linux 内核允许系统上有超过 40 亿个用户。显然这不在我得到的 uint_32 中。

我正在从事 Rust 工作,并且不会害怕编写 C 模块。但现在这是我的 main.rs:

use std::fs::*;
use std::os::unix::fs::MetadataExt;
use std::os::unix::fs::PermissionsExt;
use std::mem::transmute;


fn main(){
    let meta = metadata("./test.txt");
    if meta.is_ok(){
        let m:u32 = meta.unwrap().permissions().mode();
        //let bytes: [u8; 4] = unsafe { transmute(m.to_be()) };//etv. used later

        print!("{}",if (m & (0x1<<9)) >= 1 {"d"}else{"-"});
        print!("{}",if (m & (0x1<<8)) >= 1 {"r"}else{"-"});
        print!("{}",if (m & (0x1<<7)) >= 1 {"w"}else{"-"});
        print!("{}",if (m & (0x1<<6)) >= 1 {"x"}else{"-"});
        print!("{}",if (m & (0x1<<5)) >= 1 {"r"}else{"-"});
        print!("{}",if (m & (0x1<<4)) >= 1 {"w"}else{"-"});
        print!("{}",if (m & (0x1<<3)) >= 1 {"x"}else{"-"});
        print!("{}",if (m & (0x1<<2)) >= 1 {"r"}else{"-"});
        print!("{}",if (m & (0x1<<1)) >= 1 {"w"}else{"-"});
        println!("{}",if (m & 0x1) >= 1 {"x"}else{"-"});
        println!("{:b}",m);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您这么认为,请毫不犹豫地修改我的代码。

我这样做是为了好玩,也是为了了解更多关于地平线下的代码的信息。

小智 5

std::os::linux::fs::MetadataExt(或 os::unix)提供相关的特定于平台的功能。参考。看起来你需要meta.st_uid()meta.st_gid()等等。顺便说一句,最好像这样编写代码:

if let Ok(meta) = metadata("./test.txt") {
  println!("{}", meta.st_gid());
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Rust,并且不会害怕编写 C 模块

对于此类情况,Rust 有出色的 FFI。例如,您可以添加带有 libc 绑定的libc crate,然后libc::stat使用熟悉的 API 调用函数。