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

StackOverflow https://stackoverflow.com/questions/2033908

Вопрос

Я пишу программу в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top