【问题标题】:What is the best way to use PathBuf in a command call in Rust?在 Rust 的命令调用中使用 PathBuf 的最佳方法是什么?
【发布时间】:2021-05-01 09:34:31
【问题描述】:
Command::new(format!("git -C {} status", dir.as_path().display().to_string()));

我正在使用上面的代码converts my PathBuf variable to a String,但这是最好的方法吗?有没有不用转换就可以使用PathBuf变量的方法?

【问题讨论】:

    标签: string rust path


    【解决方案1】:

    您的示例运行可执行文件git -C $dir status,不向该可执行文件传递任何参数。只要你spawn(),它就会出错,因为你的PATH中没有这样一个奇怪的文件。

    改为运行 git 传递您的参数:

    Command::new("git").arg("-C").arg(dir).arg("status")
    

    这也使问题变得毫无意义,因为不需要转换。

    【讨论】:

    • 你说得对。假设我的原始问题没有缺陷,我已经接受@pretzelhammer 的回答作为“正确”的解决方案,但这是正确的(唯一?)方法。谢谢。
    【解决方案2】:

    我假设您担心PathBufString 的转换在PathBuf 不是有效的UTF-8 的情况下。如果是这种情况,我会将该行重构为它自己的函数并手动构造一个OsString 来创建Command

    use std::ffi::OsString;
    use std::path::PathBuf;
    use std::process::Command;
    
    fn git_status(dir: PathBuf) -> Command {
        let mut os_string: OsString = "git -C ".into();
        os_string.push(&dir);
        os_string.push(" status");
        Command::new(os_string)
    }
    

    playground

    【讨论】:

    • 谢谢你。这很好。我在这里使用 PathBuf 的唯一原因是因为我正在处理的是路径......但是如果我要转换为字符串,您是否建议将它们作为字符串开头?
    • 如果您的所有路径都将是有效的 UTF-8,并且您不需要使用任何特定于路径的方法,那么可以肯定,在这种情况下使用字符串没有任何问题。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多