Как вы определяете полные пути из аргументов командной строки файла в программе C ++?
-
19-09-2019 - |
Вопрос
Я пишу программу в C ++, которая принимает имя файла в качестве аргумента в командной строке:
>> ./myprogram ../path/to/file.txt
Я знаю, что могу просто открыть фстрим, используя argv[1]
, но программе требуется больше информации о точном местоположении (т.е. полное имя) файла.
Я думал о добавлении argv[1]
к getcwd()
, однако, очевидно в примере выше, вы получите /path/../path/to/file.txt
. Анкет Не уверен, что Fstream разрешит этот путь автоматически, но даже если он это сделал, у меня все еще нет полного пути без большой обработки строк.
Конечно, этот метод не будет работать вообще, если предоставленный путь уже был абсолютным. А поскольку эта программа может быть запущена на Linux/Windows/и т. Д., Простое обнаружение начального символа «/» не будет работать, чтобы определить, был ли аргумент полным путем или нет.
Я думаю, что это довольно распространенная проблема, чтобы справиться с именами путей в нескольких OSS. Так Как можно вернуть полное имя пути аргумента командной строки а также Как это обрабатывается между операционными системами?
Решение
Обработка PathName очень специфична для OS: у некоторых ОС есть иерархия с одним корнем (например, на UNIX), у некоторых есть несколько корней на буквы MS-Dos 'Drive Letters; У некоторых могут быть символические ссылки, жесткие ссылки или другие виды ссылок, которые могут сделать обходные. Некоторые могут даже не иметь концепции «канонического» пути к файлу (например, если файл имеет жесткие ссылки, он имеет несколько имен, ни одно из которых не является более «каноническим»).
Если вы когда-либо пытались выполнить манипуляции с именем в нескольких ОС в Java, вы знаете, что я имею в виду :-).
Короче говоря, обработка Pathname является специфичной для системы, поэтому вам придется делать это отдельно для каждой ОС (семейство) или использовать подходящую библиотеку.
Редактировать:
Вы могли бы взглянуть на Apache Portable Stime, или в Boost (C ++, хотя), оба имеют функции обработки пути.
Другие советы
... в итоге вы получите/path/../path/to/file.txt. Не уверен, что Fstream разрешит этот путь автоматически, но даже если он это сделал, у меня все еще нет полного пути без большой обработки строк.
Это происходит, и вы можете использовать/path/../path/ для всего, что вы хотите без проблем.
В любом случае, в C ++ нет стандартной функции, чтобы делать то, что вы хотите. Вы должны были бы сделать это вручную, и это не было бы тривиально ... Я предлагаю вам сохранить путь таким, какой он есть, это не должно вызывать никаких проблем.
Это ОС-зависимое. Если вы используете Linux, вы можете посмотреть RealPath (). Анкет Без сомнения, у Windows есть что -то сравнимое.
AFAIK there is no standard way.
however you could try this approach (written in pseudocode):
string raw_dirname=get_directory_part(argv[1])
string basename=get_filename_part(argv[1])
string cwd=getcwd()
chdir(relative_dirname)
string absolute_dirname=getcwd()
chdir(cwd)
string absolute_filename=absulute_dirname + separator + basename
but note: I am not quite sure if there are issues when symbolic links come into play.