Обоснование для отправки другого ответа
Я отправляю сообщение, потому что ни один из других ответов не охватывает проблемное пространство.
Ответ на ваш вопрос зависит от того, как вы получите путь.Если вы строите путь полностью внутри своего приложения, тогда посмотрите ответ от @James Kanze.Однако, если вы читаете путь или компоненты пути из среды, в которой работает ваша программа (например, переменная среды, командная строка, файлы конфигурации и т. Д.), То решение будет другим.Чтобы понять почему, нам нужно определить, что такое путь.
Быстрый обзор путей
В операционных системах (о которых я знаю) путь - это строка, которая соответствуетна мини-язык, указанный операционной системой и файловой системой (система для краткости).Пути могут быть предоставлены для функций ввода-вывода в данной системе для доступа к некоторому ресурсу.Например, вот несколько путей, с которыми вы можете столкнуться в Windows:
\file.txt
\\bob\admin$\file.txt
C:..\file.txt
\\?\C:\file.txt
.././file.txt
\\.\PhysicalDisk1\bob.txt
\\;WebDavRedirector\bob.com\xyz
C:\PROGRA~1\bob.txt
.\A:B
Решение проблемы с помощью манипуляции путями
Представьте себе следующий сценарий: ваша программа поддерживает аргумент командной строки, --output-path=<path>
, который позволяет пользователям указывать путь, по которому ваша программа должна создавать выходные файлы.Решение для создания файлов в указанном каталоге:
- Анализ указанного пользователем пути на основе мини-языка системы, в которой вы работаете.
- Создание нового путина мини-языке, который указывает правильное местоположение для записи файла, используя имя файла и информацию, которую вы проанализировали на шаге 1.
- Откройте файл, используя путь, сгенерированный на шаге 2.
Пример этого:
В Linux, скажем, пользователь указал --output-path=/dir1/dir2
Разобрать этот мини-язык:
/dir1/dir2
--> "/" root
--> "dir1" directory under root
--> "/" path seperator
--> "dir2" directory under dir1
Тогда, когда мы захотимчтобы вывести файл в указанном каталоге, мы строим новый путь.Например, если мы хотим вывести файл с именем bob.txt
, мы можем построить следующий путь:
/dir1/dir2/bob.txt
--> "/" root
--> "dir1" directory under root
--> "/" path separator
--> "dir2" directory under dir1
--> "/" path seperator
--> "bob.txt" file in directory dir2
Затем мы можем использовать этот новый путь для создания файла.
InВообще невозможно полностью реализовать это решение.Даже если бы вы могли написать код, который мог бы успешно декодировать все существующие мини-языки пути и правильно представлять информацию о каждой системе, чтобы можно было правильно построить новый путь - в будущем ваша программа может быть построена или запущена на новых системах, которые имеютновые пути мини-языков, которые ваша программа не может обработать.Поэтому нам нужно использовать осторожную стратегию для управления путями.
Стратегии обработки путей
1.Полностью избегайте манипулирования путями
Не пытайтесь манипулировать путями, которые вводятся в вашу программу.Вы должны передать эти строки непосредственно в API-функции, которые могут обрабатывать их правильно.Это означает, что вам нужно использовать специфичные для OS API, напрямую избегая абстракций ввода-вывода файла C ++ (или вы должны быть абсолютно уверены, как эти абстракции реализованы в каждой ОС).Обязательно тщательно продумайте интерфейс к вашей программе, чтобы избежать ситуации, когда вас могут заставить манипулировать путями.Попробуйте реализовать алгоритмы для вашей программы, чтобы аналогичным образом избежать необходимости манипулирования путями.Документируйте функции API, которые ваша программа использует в каждой ОС для пользователя - это потому, что сами функции API OS со временем становятся устаревшими, поэтому в будущем ваша программа может быть несовместима со всеми возможными путями, даже если вы будете осторожны, чтобы избежать манипулирования путями.1045 *
2.Документируйте функции, которые ваша программа использует для манипулирования путями
Документируйте пользователю, как именно будут обрабатываться пути.Затем проясните, что именно пользователи должны указать пути, которые будут корректно работать с документированным поведением программы.
3.Поддерживать только ограниченный набор путей
Ограничивайте пути мини-языков, которые ваша программа будет принимать, пока вы не уверены, что можете правильно манипулировать подмножеством путей, которые соответствуют этому набору ограничений. Документируйте это пользователю. Ошибка, если введены пути, которые не соответствуют.
4. Игнорировать проблемы
Выполните некоторые базовые манипуляции с путями, не беспокоясь слишком сильно. Примите, что ваша программа будет показывать неопределенное поведение для некоторых входных путей. Вы можете задокументировать пользователю, что программа может работать, а может и не работать, когда они вводят пути к ней, и что это пользователи ответственно, чтобы убедиться, что программа правильно обработала пути ввода. Однако вы также не могли ничего документировать. Пользователи обычно ожидают, что ваша программа не будет правильно обрабатывать некоторые пути (многие этого не делают) и, следовательно, будет справляться даже без документации.
Заключительные мысли
Важно выбрать эффективную стратегию для работы с путями на ранних этапах жизненного цикла вашей программы. Если вам придется изменить способ обработки путей позже, может быть трудно избежать изменения поведения, которое может нарушить вашу программу для существующих пользователей.