如何在Rust中获取标准输入重定向的文件名?
请提供需要进行Markdown格式化的具体内容,我会严格按照你给出的规则完成格式化操作。
如果是针对你之前提出的Rust获取标准输入重定向文件名的问题,以下是符合要求的Stack Overflow风格回答:
如何在Rust中获取标准输入重定向的源文件名?
当你使用cargo run < filename.csv这种Shell重定向方式时,程序本身无法直接获取到源文件名——因为Shell已经完成了文件内容到标准输入流的转发,你的Rust程序拿到的只是一个标准输入句柄(也就是你看到的Stdin { .. }),这个句柄里不包含任何关于源文件的元信息。
为什么你的尝试无效?
io::read_to_string(io::stdin())只能读取文件的内容,完全无法拿到文件名,哪怕内容里有.csv后缀也和文件名本身无关。- 标准输入流本身没有携带文件名属性,无论用什么方法读取流内容,都找不到文件名。
可行的解决办法
要获取文件名,你需要换一种方式传递文件:
- 作为命令行参数传入(推荐)
这是最符合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
- Shell技巧传递文件名(特殊场景)
如果一定要保留重定向形式,可以通过Shell先传递文件名再传递内容,但需要用户配合修改调用命令:
(echo "filename.csv"; cat filename.csv) | cargo run
之后程序先读取第一行作为文件名,再读取后续内容。这种方式不够优雅,仅适合特殊需求场景。
总结
标准输入重定向的设计初衷就是隐藏源文件信息,只传递内容。如果程序需要获取文件名,优先使用命令行参数是最可靠的方案。
内容的提问来源于stack exchange,提问作者Mypantsrtooobig
相关产品推荐
相关产品推荐

