如何将Path传递给Command :: arg?

时间:2018-05-30 05:37:42

标签: rust

经过长时间休息后我又回到了Rust。我试图做以下事情:

use std::fs;
use std::path::Path;
use std::process::Command;

fn main() {
    let paths = fs::read_dir("SOME_DIRECTORY").unwrap();
    for path in paths {
        let full_path = path.unwrap().path();
        process(full_path);
    }
}

fn process<P: AsRef<Path>>(path: P) {
    let output = Command::new("gunzip")
        .arg("--stdout")
        .arg(path.as_os_str())
        .output()
        .expect("failed to execute process");
}
error[E0599]: no method named `as_os_str` found for type `P` in the current scope
  --> src/main.rs:50:23
   |
50 |             .arg(path.as_os_str())
   |                       ^^^^^^^^^

Command::Arg期待一个OsStr,但由于某些原因我无法将Path转换为OsStr(与AsRef有关吗?)

1 个答案:

答案 0 :(得分:2)

如果您阅读了Command::arg的签名,则可以看到它接受的类型。它是可以作为OsStr引用的任何类型:

pub fn arg<S: AsRef<OsStr>>(&mut self, arg: S) -> &mut Command

如果查看implementors of AsRef,您会看到Path是一个:

impl AsRef<OsStr> for PathBuf {}
impl AsRef<OsStr> for Path {}

回到你的问题:

  

如何将Path传递给Command :: arg?

通过Path传递给arg

fn process(path: &Path) {
    let output = Command::new("gunzip")
        .arg("--stdout")
        .arg(path)
        .output()
        .expect("failed to execute process");
}

您的问题是您已接受通用P,只保证实施一个特征:P: AsRef<Path>它不是Path 。这就是错误消息告诉您没有方法as_os_str

的原因
  
error[E0599]: no method named `as_os_str` found for type `P` in the current scope

您可以为此类型做的唯一事情就是致电as_ref。这将返回&Path

let output = Command::new("gunzip")
    .arg("--stdout")
    .arg(path.as_ref())
    .output()
    .expect("failed to execute process");