2016-05-05 3 views
0

In vielen Programmiersprachen kann man finden, wenn Datei ausführbar ist oder nicht, durch ein bitwise and zwischen dem mode bits und 0111, so etwas wie tun: wie 100755Wie überprüft man, ob die Datei mit bitweisen Operationen in Rust ausführbar ist?

is_exec = (mode & 0111) != 0 

Wo mode stellt das Modus-Bits mit einem Oktalwert etwas, oder 755.

Befehlszeile Beispiel:

perl -e 'printf "%o\n", (stat "file")[2] & 0111' 

Ich versuche, mit diesem Ansatz Rust zu folgen, aber kann es nicht funktioniert, dann ist dies der Code verwende ich:

fn print_dir(path: &PathBuf) {                                    
    let files = match fs::read_dir(&path) {                                
     Err(f) => {                                      
      println!("{}", f);                                    
      return;                                      
     }                                         
     Ok(f) => f                                       
    };                                          

    for f in files {                                      
     let file = f.unwrap();                                    
     let mode = file.metadata().unwrap().permissions().mode();                           
     println!("path: {} {:o} - {} {:0}", file.path().display(), mode, mode, mode & 0111);                    
    }                                          
} 

Die mode & 0111 verhält sich nicht wie erwartet, da es immer positive Ergebnisse liefert. Ich habe versucht, einen ähnlichen Code in Go, und es war sehr einfach:

var is_exec bool 
if m := f.Mode(); !m.IsDir() && m&0111 != 0 { 
    is_exec = true 
} 

Jede Idee, wie diese mit Rust zu tun?

Antwort

4

In Rust, eine führende 0 bedeutet nicht, dass eine Zahl in oktal ist. Sie möchten das Präfix verwenden 0o statt:

fn main() { 
    println!("{}", 0111); // 111 
    println!("{}", 0o111); // 73 
} 

Other prefixes Sie interessiert sein könnten:

0xBEEF // Hex (Base 16) => 48879 
0o1234 // Octal (Base 8) => 668 
0b0101 // Binary (Base 2) =>  5 
1

Sie nah dran sind, sollten Sie dies nutzen (I unwrap() im Beispiel der Kürze halber verwenden):

let mode = fs::metadata(&f).unwrap().mode(); 
if mode & 0o111 != 0 { 
    println!("binary..."); 
} 

Kredit aufgrund some code ich vor einer Weile arbeitete.

Verwandte Themen