我试图保存文件名从标准输入作为一个字符串。在我的研究到目前为止,我只发现有能力读取文件数据作为一个整体字符串或逐行,但没有得到确切的文本写为标准输入。
在执行代码时,我正在执行:
cargo run < filename.csv
字符串
我希望我的输出是filename.csv
,但我得到了这个:Stdin { .. }
我的倾向是应该有一些方法来“捕捉”输入之前,它将开始阅读字节为我的文件,但我迷失在这里。
这是我正在运行的代码。我将整个输入作为一个字符串读取,试图通过grep查找文件扩展名(.csv),但我没有找到任何东西:
let stdin = io::read_to_string(io::stdin());
println!("{:?}",stdin);
型
2条答案
按热度按时间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上,你可以使用
GetStdHandle
和GetFileInformationByHandleEx
的组合,但是这两个都需要不安全的代码,并且GetFileInformationByHandleEx
由于其C API的设计方式而接受原始指针,因此使用起来更烦人。我不确定这个功能是否在crate中可用。我简单地浏览了一下NT对象命名空间,希望能有与上面的/proc/
类似的技巧,但找不到任何东西htrmnn0y2#
要从Rust的标准输入中打印文件名,可以使用std::env::args函数。该函数返回传递给程序的命令行参数的迭代器。
下面是一个示例代码片段,演示了如何实现这一点:
字符串