Подтвердить что ты не робот

Как получить абсолютный путь к файлу или директории, который делает * not *?

Как определить абсолютный путь файла или каталога из заданного относительного пути в C/С++ на GNU/Linux?
Я знаю о realpath(), но он не работает с несуществующими файлами.

Скажем, пользователь входит в ../non-existant-directory/file.txt, а рабочий каталог программ - /home/user/.
Мне нужна функция, которая возвращает /home/non-existant-directory/file.txt.

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

4b9b3361

Ответ 1

Попробуйте realpath. Если это не удается, начните удалять компоненты пути с конца по одному и повторите попытку realpath, пока это не удастся. Затем добавьте компоненты, которые вы удалили, на результат успешного вызова realpath.

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

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

Ответ 2

Вы можете получить текущий каталог и применить следующую логику:

Если путь начинается с "/", замените текущий каталог корневым

Для каждого каталога, указанного в относительном пути, выполните следующие действия:

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

  • В противном случае: проверьте, существует ли такой каталог в текущем каталоге.

  • Если он существует, но не является каталогом, ошибка сигнала (если только последняя запись в пути)

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

  • Если он существует и является каталогом, но не символической ссылкой, добавьте этот каталог в текущий путь к каталогу (т.е. замените текущий каталог на проверяемый подкаталог)

  • Если он не существует, добавьте оставшиеся части относительного пути к пути к текущему каталогу и остановите.