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

68de4m5k  于 2023-10-16  发布在  Linux
关注(0)|答案(2)|浏览(131)

我正在使用递归文件搜索,并让它使用简单的权限,但我不能确定如何获取文件夹或文件的所有者(所有者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);
    }
}

不要犹豫,修改我的代码,如果你这样认为。
我这样做是为了好玩,也是为了更多地了解地平线下的代码。

qyswt5oh

qyswt5oh1#

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

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

我在Rust工作,不会害怕写C模块
Rust对这种情况有很好的FFI。例如,您可以添加带有libc绑定的libc crate,并使用熟悉的API调用libc::stat函数。

ha5z0ras

ha5z0ras2#

所有者是meta.unwrap().uid(),组是meta.unwrap().gid()。它们都是u32,这是Linux使用的。
要获取实际名称,请使用libc::getpwuid_rlibc::getgrgid_r。参见getpwuid(3)getgrgid(3)

相关问题