Как получить абсолютный путь к файлу или директории, который делает * not *?
Как определить абсолютный путь файла или каталога из заданного относительного пути в C/С++ на GNU/Linux?
Я знаю о realpath()
, но он не работает с несуществующими файлами.
Скажем, пользователь входит в ../non-existant-directory/file.txt
, а рабочий каталог программ - /home/user/
.
Мне нужна функция, которая возвращает /home/non-existant-directory/file.txt
.
Мне нужна эта функция, чтобы проверить, находится ли данный путь в определенном подкаталоге или нет.
Ответы
Ответ 1
Попробуйте realpath
. Если это не удается, начните удалять компоненты пути с конца по одному и повторите попытку realpath
, пока это не удастся. Затем добавьте компоненты, которые вы удалили, на результат успешного вызова realpath
.
Если вы уверены, что содержащая директория существует, и вы просто хотите сделать там файл, вам нужно удалить не более одного компонента.
Другим подходом было бы просто сначала создать файл, а затем вызвать realpath
.
Ответ 2
Вы можете получить текущий каталог и применить следующую логику:
Если путь начинается с "/", замените текущий каталог корневым
Для каждого каталога, указанного в относительном пути, выполните следующие действия:
-
Если вы находитесь на последней части относительного пути, добавьте его в текущий путь к каталогу и остановите: путь к текущему каталогу является абсолютным путем.
-
В противном случае: проверьте, существует ли такой каталог в текущем каталоге.
-
Если он существует, но не является каталогом, ошибка сигнала (если только последняя запись в пути)
-
Если он существует и является каталогом, посмотрите, является ли это символической ссылкой (в ОС, поддерживающих эту функцию). Если да, замените текущий каталог указателем на каталог символической ссылки.
-
Если он существует и является каталогом, но не символической ссылкой, добавьте этот каталог в текущий путь к каталогу (т.е. замените текущий каталог на проверяемый подкаталог)
-
Если он не существует, добавьте оставшиеся части относительного пути к пути к текущему каталогу и остановите.