Как вы определяете полные пути из аргументов командной строки имени файла в программе на C ++? - PullRequest
0 голосов
/ 09 января 2010

Я пишу программу на c ++, которая принимает имя файла в качестве аргумента в командной строке:

>> ./myprogram ../path/to/file.txt

Я знаю, что могу просто открыть fstream, используя argv[1], но программе требуется больше информации о точном расположении (т.е. полном пути) файла.

Я думал о добавлении argv[1] к getcwd(), однако очевидно, что в приведенном выше примере вы получите /path/../path/to/file.txt. Не уверен, что fstream разрешит этот путь автоматически, но даже если бы он это сделал, у меня все еще нет полного пути без большой обработки строк.

Конечно, этот метод не будет работать вообще, если предоставленный путь уже будет абсолютным. А поскольку эта программа может быть запущена в Linux / Windows / etc, простое обнаружение начального символа '/' не поможет определить, был ли аргумент полным путем или нет.

Я думаю, что это довольно распространенная проблема, связанная с именами путей в разных ОС. Итак, как получить полный путь к аргументу командной строки и , как это обрабатывается между операционными системами ?

Ответы [ 4 ]

3 голосов
/ 09 января 2010

Обработка пути в значительной степени зависит от ОС: некоторые ОС имеют иерархию с одним корнем (например, в Unix), некоторые имеют несколько корней в виде букв дисков MS-DOS; у некоторых могут быть символические ссылки, жесткие ссылки или другие виды ссылок, которые могут усложнить обход. Некоторые могут даже не иметь понятия «канонического» пути к файлу (например, если файл имеет жесткие ссылки, он имеет несколько имен, ни одно из которых не является более «каноническим»).

Если вы когда-либо пытались манипулировать именами путей в нескольких ОС на Java, вы понимаете, что я имею в виду: -).

Короче говоря, обработка имени пути зависит от системы, поэтому вам придется делать это отдельно для каждой ОС (семейства) или использовать подходящую библиотеку.

Редактировать

Вы можете посмотреть на Apache Portable Runtime или Boost (хотя C ++), оба имеют функции обработки имён путей.

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

AFAIK нет стандартного способа.

однако вы можете попробовать этот подход (написанный в псевдокоде):

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

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

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

Это зависит от ОС. Если вы используете Linux, вы можете посмотреть на realpath () . Нет сомнений, что в Windows есть что-то сопоставимое.

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

... в конечном итоге вы получите /path/../path/to/file.txt. Точно сказать не могу решит ли fstream, что путь автоматически, но даже если он сделал, у меня все еще нет полного пути без большого количества обработки строк.

Да, и вы можете использовать /path/../path/ для всего, что вы хотите без проблем.

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

...