You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中获取标准输入重定向的文件名?

请提供需要进行Markdown格式化的具体内容,我会严格按照你给出的规则完成格式化操作。


如果是针对你之前提出的Rust获取标准输入重定向文件名的问题,以下是符合要求的Stack Overflow风格回答:

如何在Rust中获取标准输入重定向的源文件名?

当你使用cargo run < filename.csv这种Shell重定向方式时,程序本身无法直接获取到源文件名——因为Shell已经完成了文件内容到标准输入流的转发,你的Rust程序拿到的只是一个标准输入句柄(也就是你看到的Stdin { .. }),这个句柄里不包含任何关于源文件的元信息。

为什么你的尝试无效?

  • io::read_to_string(io::stdin())只能读取文件的内容,完全无法拿到文件名,哪怕内容里有.csv后缀也和文件名本身无关。
  • 标准输入流本身没有携带文件名属性,无论用什么方法读取流内容,都找不到文件名。

可行的解决办法

要获取文件名,你需要换一种方式传递文件:

  1. 作为命令行参数传入(推荐)
    这是最符合Unix/Linux程序设计惯例的方式,修改程序接收命令行参数作为文件名:
use std::env;
use std::fs::File;
use std::io::Read;

fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() < 2 {
        eprintln!("请传入文件名作为参数");
        std::process::exit(1);
    }
    let filename = &args[1];
    println!("{}", filename);

    // 若需要读取文件内容
    let mut file = File::open(filename).expect("无法打开文件");
    let mut content = String::new();
    file.read_to_string(&mut content).expect("读取文件失败");
    // 后续内容处理逻辑...
}

运行方式改为:

cargo run filename.csv
  1. Shell技巧传递文件名(特殊场景)
    如果一定要保留重定向形式,可以通过Shell先传递文件名再传递内容,但需要用户配合修改调用命令:
(echo "filename.csv"; cat filename.csv) | cargo run

之后程序先读取第一行作为文件名,再读取后续内容。这种方式不够优雅,仅适合特殊需求场景。

总结

标准输入重定向的设计初衷就是隐藏源文件信息,只传递内容。如果程序需要获取文件名,优先使用命令行参数是最可靠的方案。

内容的提问来源于stack exchange,提问作者Mypantsrtooobig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:38:25