Межплатформенная обработка путей к файлам
-
02-07-2019 - |
Вопрос
Существуют ли какие-либо автономные классы C++ GNU, которые обрабатывают межплатформенные пути?Мои приложения основаны на Windows и Linux.Наши файлы конфигурации ссылаются на другой файл в отдельном каталоге.Я хотел бы иметь возможность прочитать путь к другому файлу конфигурации в класс, который будет работать как в Linux, так и в Windows.
Какой класс будет предлагать наименьший объем преобразований путей для использования в любой системе?Спасибо
Решение
Если вы не используете абсолютные пути, в переводе вообще нет необходимости — Windows автоматически преобразует прямые косые черты в обратную косую черту, поэтому, если вы используете относительные пути с разделителями путей прямой косой чертой, вы будете золотым.Вам действительно следует избегать абсолютных путей, если это вообще возможно.
Другие советы
пытаться boost::файловая система
Библиотека файловой системы in boost, вероятно, вам поможет.
Есть много способов, ИМХО, правильный ответ — перепроектировать вашу программу, чтобы избежать манипулирования путями.Я разместил ответ здесь: https://stackoverflow.com/a/40980510/2345997 что актуально.
способы:
- Добавьте параметр командной строки, который позволяет пользователю указать соответствующий путь вместо того, чтобы читать его из файла конфигурации.
- Добавьте параметр командной строки, чтобы пользователь мог указать базовый путь.Пути в файле конфигурации будут интерпретироваться как расположенные по этому базовому пути.
- Разделите файл конфигурации на три.Один файл будет иметь кроссплатформенную конфигурацию, другой файл будет иметь конфигурацию только для Windows, а последний файл будет иметь конфигурацию только для Linux.Тогда пользователь сможет указать правильный путь как для Windows, так и для Linux.В Windows ваша программа будет читать кросс-платформенный файл конфигурации и файл конфигурации только для Windows.В Linux он будет читать кроссплатформенный файл и файл конфигурации только для Linux.
- Добавьте предварительную обработку в анализ файла конфигурации.Это позволит вам иметь один файл конфигурации, в котором пользователь может заставить вашу программу игнорировать некоторые строки в файле в зависимости от того, на какой ОС запущена программа.Таким образом, пользователь сможет указать путь к файлу дважды.Один раз для Linux и один раз для Windows.
- Измените дизайн так, чтобы файлы всегда находились в том же каталоге, что и ваш исполняемый файл — тогда пользователь укажет в файле конфигурации только имена файлов, а не пути к файлам.
- Используйте простую функцию, которая переключает «/» на «\».Затем сообщите пользователю, что он должен указать пути как пути Linux, и это преобразование будет применено к Windows.
- Создайте для этого свой собственный мини-язык пути и задокументируйте его для пользователя.Например:«/» — указывает разделитель каталогов, {root} — расширяется до корня файловой системы, {cwd} — расширяется до текущего каталога, {app} — расширяется до пути к вашему приложению и т. д.Затем пользователь может указать пути к файлам, например:{root}/myfiles/bob.txt на обеих платформах.
- Некоторые пути будут работать на обеих платформах.Например:относительные пути, такие как ../my files/bill.txt.Ограничьте свое приложение работой только с этими путями.Задокументируйте это ограничение и то, как ваше приложение обрабатывает пути к пользователю.