rust 从标准输入打印文件名

qni6mghb  于 2024-01-08  发布在  其他
关注(0)|答案(2)|浏览(138)

我试图保存文件名从标准输入作为一个字符串。在我的研究到目前为止,我只发现有能力读取文件数据作为一个整体字符串或逐行,但没有得到确切的文本写为标准输入。
在执行代码时,我正在执行:

cargo run < filename.csv

字符串
我希望我的输出是filename.csv,但我得到了这个:Stdin { .. }
我的倾向是应该有一些方法来“捕捉”输入之前,它将开始阅读字节为我的文件,但我迷失在这里。
这是我正在运行的代码。我将整个输入作为一个字符串读取,试图通过grep查找文件扩展名(.csv),但我没有找到任何东西:

let stdin = io::read_to_string(io::stdin());
println!("{:?}",stdin);

c2e8gylq

c2e8gylq1#

在Linux操作系统上的大多数典型shell中,在这种情况下,您的二进制文件(rust或其他)不知道其标准输出来自何处。shell负责打开filename.csv文件描述符进行读取,并确保它是随后启动的进程的标准输入(在Linux上,这是文件描述符0)。
获取文件名不一定是可能的(例如,标准输入可以是匿名管道),并且它可能不指向文件(例如,它可能指向Linux上的pty);此外,获取文件名的过程依赖于系统。
在Linux上,您可以将std::fs::read_link/proc/self/fd/0一起使用,但前提是它可能不是文件名。在我的Linux机器上,我在快速测试时会得到文件名、/dev/pts/...pipe:[...]作为输出。
在Windows上,你可以使用GetStdHandleGetFileInformationByHandleEx的组合,但是这两个都需要不安全的代码,并且GetFileInformationByHandleEx由于其C API的设计方式而接受原始指针,因此使用起来更烦人。我不确定这个功能是否在crate中可用。我简单地浏览了一下NT对象命名空间,希望能有与上面的/proc/类似的技巧,但找不到任何东西

htrmnn0y

htrmnn0y2#

要从Rust的标准输入中打印文件名,可以使用std::env::args函数。该函数返回传递给程序的命令行参数的迭代器。
下面是一个示例代码片段,演示了如何实现这一点:

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    
    if let Some(file_name) = args.get(1) {
        println!("{}", file_name);
    } else {
        eprintln!("No file name provided.");
    }
}

字符串

相关问题