【问题标题】:How to get the name of current program without the directory part?如何在没有目录部分的情况下获取当前程序的名称?
【发布时间】:2016-04-25 18:15:43
【问题描述】:

在 Bash 中,这将是 ${0##*/}

use std::env;
use std::path::Path;

fn prog() -> String {
    let prog = env::args().next().unwrap();
    String::from(Path::new(&prog).file_name().unwrap().to_str().unwrap())
}

fn main() {
    println!("{}", prog());
}

有没有更好的方法? (我特别不喜欢那些众多的unwrap()s。)

【问题讨论】:

  • 您可能想使用std::env::current_exe(),而不是查看argv[0]。

标签: rust


【解决方案1】:

如果您不关心为什么您无法获得程序名称,您可以使用mapand_then 的明智组合来处理所有潜在错误。此外,返回 Option 以指示可能的失败:

use std::env;
use std::path::Path;
use std::ffi::OsStr;

fn prog() -> Option<String> {
    env::args().next()
        .as_ref()
        .map(Path::new)
        .and_then(Path::file_name)
        .and_then(OsStr::to_str)
        .map(String::from)
}

fn main() {
    println!("{:?}", prog());
}

如果您想关注delnan's awesome suggestion 以使用std::env::current_exe(我刚刚了解到!),请将env::args().next() 替换为env::current_exe().ok()


如果您确实想知道为什么无法获得程序名称(知道原因通常是解决问题的第一步),请查看ker's answer

【讨论】:

  • functional-programming.txt
  • 我希望env::args().next() 永远不会失败。
  • 但是,根据documentation,它可能: > 第一个元素传统上是可执行文件的路径,但它可以设置为任意文本,甚至可能不存在。这意味着不应出于安全目的依赖此属性。
  • @vvv 和the docs for current_exe 继续补充:一些错误可能包括但不限于文件系统操作失败或一般系统调用失败。
【解决方案2】:

您还可以摆脱展开并仍然正确报告所有错误原因(而不是将它们咀嚼成“失败的事情”None)。您甚至不需要指定转换方法的完整路径:

fn prog() -> Result<String, ProgError> {
    let path = try!(env::current_exe());
    let name = try!(path.file_name().ok_or(ProgError::NoFile));
    let s_name = try!(name.to_str().ok_or(ProgError::NotUtf8));
    Ok(s_name.to_owned())
}

与未来的问号运算符一起,这也可以写成一个单点调用链:

fn prog() -> Result<String, ProgError> {
    Ok(env::current_exe()?
        .file_name().ok_or(ProgError::NoFile)?
        .to_str().ok_or(ProgError::NotUtf8)?
        .to_owned())
}

当然这有ProgError类型的先决条件:

use std::io::Error;

#[derive(Debug)]
enum ProgError {
    NoFile,
    NotUtf8,
    Io(Error),
}

impl From<Error> for ProgError {
    fn from(err: Error) -> ProgError {
        ProgError::Io(err)
    }
}

try it out on the Playground

【讨论】:

  • 仅供参考,quick-error crate 提供了一个宏来构造这些错误类型以及 From 实现。相当不错。
【解决方案3】:

还有一个Option 版本:)

fn prog() -> Option<String> {
    std::env::current_exe()
        .ok()?
        .file_name()?
        .to_str()?
        .to_owned()
        .into()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2014-02-12
    • 2011-08-26
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多