Можно ли извлечь имя файла из перенаправления? - PullRequest
1 голос
/ 06 ноября 2011

Я делаю некоторые базовые манипуляции с файлами и хотел бы сохранить имя файла, передаваемого исполняемой программе на C, и создать новый файл с расширением, привязанным к исходному имени файла.Например, если бы это было то, что я набрал в командной строке:

a.out < some_file.txt

Где a.out - исполняемый файл, есть ли способ получить строку some_file.txt, чтобы я мог открыть новуюфайл и назовите его some_file.text.mod или что-то еще?

argv[0] возвращает вас a.out, и в сценариях вы можете использовать $1 для доступа к аргументам (но не к именам файлов, используемым при перенаправлении), но нииз них много пользы здесь.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2011

Это возможно на некоторых платформах, используя специфические для платформы конструкции.

например. в Linux вы можете вызвать readlink () в / proc / self / fd / 0

Другие формы перенаправления не обеспечивают доступ к имени файла, файл может отсутствовать - данные могут передаваться по каналу.

В вашем случае вам, вероятно, лучше позволить пользователю выбрать выходное имя файла в тех случаях, когда ввод перенаправляется через стандартный ввод

1 голос
/ 06 ноября 2011

Иногда (и почти всегда на практике) /proc/self/fd/0 может быть символической ссылкой на файл.(Но символическая ссылка может быть дрянной, например, для канала, и это специфично для Linux.)1008 * Но делать это немного отвратительно .Однако это работает:

% 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.

...