是否可以从重定向中检索文件的名称?

时间:2011-11-06 18:14:49

标签: c file stdin

我正在进行一些基本的文件操作,并且希望将传递给可执行C程序的文件的名称存储起来,并创建一个在原始文件名上添加了扩展名的新文件。例如,如果这是我在命令行上输入的内容:

a.out < some_file.txt

a.out是可执行文件,有没有办法获取字符串some_file.txt,所以我可以打开一个新文件并将其称为some_file.text.mod或其他?

argv[0]为您提供a.out,在脚本编写中,您可以使用$1来访问参数(但不能使用重定向中使用的文件名),但这些都不是很有用。< / p>

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在某些平台上,可以使用特定于平台的构造。

e.g。在linux上你可以在/ proc / self / fd / 0上调用readlink()

其他形式的重定向不提供对文件名的访问,可能没有文件 - 数据可能通过管道提供。

对于您的情况,在输入通过stdin重定向的情况下,让用户决定输出文件名可能会更好

答案 1 :(得分:1)

有时(并且几乎总是在实践中)/proc/self/fd/0可能是文件的符号链接。 (但是符号链接可能很糟糕,例如管道,这是特定于Linux的。)

因此,您可以在a.out内拨打readlink(2)系统调用/proc/self/fd/0

但这样做有点恶心。无论如何:

% ls -l /proc/self/fd/0 < ~/.zshrc
lr-x------ 1 basile basile 64 Nov  6 19:22 /proc/self/fd/0 -> /home/basile/.zshrc

% date | ls -l /proc/self/fd/0
lr-x------ 1 basile basile 64 Nov  6 19:23 /proc/self/fd/0 -> pipe:[599869]

同样,它是高度特定于Linux的,并且无法移植到其他Posix系统。