显示文件元数据等的所有者和组使用锈

问题描述 投票:0回答:2

我的工作递归文件搜索,并得到了它与简单的权限的工作,但我不能确定的是如何得到一个文件夹或文件的所有者(所有者ID)或基团(组ID)。我发现如何得到一个文件或文件夹的当前权限。我得到一个uint_32使约9的这个位被用来保存权限。但是,在何处以及如何被时间戳保存?和老板?在我的研究,我读过的Linux内核,允许超过4个十亿用户的系统上。显然,这不是在我得到了uint_32。

我在防锈工作,就不会害怕写一个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);
    }
}

不要犹豫,修改我的代码,如果你这样认为。

我这样做是为了好玩,并更多地了解地平线下面的代码。

linux rust
2个回答
1
投票

std::os::linux::fs::MetadataExt(或OS :: UNIX)提供有关特定于平台的功能。 Reference。看起来你需要meta.std_uid()meta.st_gid()等顺便说一句,这是更好写你这样的代码:

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

我在防锈工作,就不会害怕写一个C模块

锈有这样的情况下出色的FFI。例如,你可以用绑定的libc添加libc箱并调用libc::stat与熟悉的API函数。


1
投票

店主是meta.unwrap().uid()和组是meta.unwrap().gid()。他们u32每个,这是Linux使用。

要获得实际的名称,使用libc::getpwuid_rlibc::getgrgid_r。参见getpwuid(3)getgrgid(3)

© www.soinside.com 2019 - 2024. All rights reserved.