от объекта файла к имени файла - PullRequest
4 голосов
/ 12 января 2010

Интересно, сможем ли мы получить имя файла, включая его путь, из объекта файла, который мы создали для имени файла в C и C ++ соответственно

FILE *fp = fopen(filename, mode); // in C
ofstream out(filename); // in C++
ifstream in(filename);  // in C++

Спасибо! * * 1004

Ответы [ 3 ]

9 голосов
/ 12 января 2010

Вы не можете, в общем. Файл, возможно, никогда не имел имени файла, так как это может быть стандартный ввод, вывод или ошибка или сокет. Файл также может быть удален; по крайней мере, в Unix вы все равно можете читать или записывать файл, который был удален, так как процесс сохраняет ссылку на него, поэтому сам файл не удаляется до тех пор, пока счетчик ссылок не станет равным нулю. Также может быть несколько имен для файла; Вы можете иметь несколько жестких ссылок на один файл.

Если вы хотите сохранить информацию о том, откуда пришел файл, я бы предложил создать собственную структуру или класс, состоящий из имени файла и указателя файла или потока.

9 голосов
/ 12 января 2010

Нет переносимого способа получить имя файла объекта FILE *. Он может даже не быть связан с реальным файлом (например, указатель FILE для stdout).

1 голос
/ 12 января 2010

Переносного пути нет. Однако у определенных платформ иногда есть способы сделать это.

В Windows, если вы можете получить HANDLE файла (например, тот, который вы получаете из :: CreateFile ()), вы можете получить путь к нему, используя что-то вроде ZwQueryInformationFile ().

Из ФАЙЛА * вы можете получить идентификатор файла (в стиле Unix), используя _fileno (). Затем вызовите _get_oshandle (), чтобы получить РУЧКУ.

Не уверен, как это сделать с помощью std :: ofstream, но вы можете исследовать это.

Не уверен, как это сделать на других ОС, но это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...