Обработка путей к файлам на разных платформах

Существуют ли какие-либо автономные классы С++ GNU, которые обрабатывают кроссплатформенные пути? Мои приложения строятся на Windows и Linux. Наши файлы конфигурации ссылаются на другой файл в отдельном каталоге. Я хотел бы иметь возможность прочитать путь к другому файлу конфигурации в класс, который будет работать как в Linux, так и в Windows.

Какой класс предложит наименьшую площадь для преобразования путей для использования в любой из систем? Спасибо


person Superpolock    schedule 23.09.2008    source источник


Ответы (4)


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

person Adam Rosenfield    schedule 23.09.2008
comment
Для моей простой потребности это идеально. - person Superpolock; 23.09.2008
comment
не переносится на ОС с другими правилами экранирования, кавычек и разделителей (например, Mac) - person jwfearn; 24.09.2008

попробуйте boost::filesystem

person gbjbaanb    schedule 23.09.2008
comment
Повышение кажется очень полным, но для моих основных потребностей это слишком. Спасибо за отзыв. - person Superpolock; 23.09.2008

библиотека файловой системы в boost, вероятно, вам поможет.

person Jonas Engström    schedule 23.09.2008

Есть много способов, ИМХО, правильный ответ - изменить дизайн вашей программы, чтобы избежать манипулирования путями. Я разместил ответ здесь: https://stackoverflow.com/a/40980510/2345997, что актуально.

способы:

  1. Добавьте параметр командной строки, который позволяет пользователю указать рассматриваемый путь, а не читать его из файла конфигурации.
  2. Добавьте параметр командной строки, чтобы пользователь мог указать базовый путь. Пути в файле конфигурации будут интерпретироваться как расположенные по этому базовому пути.
  3. Разделите файл конфигурации на три части. Один файл будет иметь кросс-платформенную конфигурацию, другой файл будет иметь конфигурацию только для Windows, а последний файл будет иметь конфигурацию только для Linux. Затем пользователь может указать правильный путь как для Windows, так и для Linux. В Windows ваша программа будет читать кроссплатформенный файл конфигурации и файл конфигурации только для Windows. В Linux он будет читать кроссплатформенный файл и файл конфигурации только для Linux.
  4. Добавьте предварительную обработку к разбору файла конфигурации. Это позволит вам иметь один файл конфигурации, в котором пользователь может заставить вашу программу игнорировать некоторые строки в файле в зависимости от того, на какой ОС работает программа. Таким образом, пользователь сможет дважды указать путь к файлу. Один раз для Linux и один раз для Windows.
  5. Измените дизайн так, чтобы файлы всегда находились в той же директории, что и ваш исполняемый файл - тогда пользователь указывает только имена файлов в файле конфигурации, а не пути к файлам.
  6. Используйте простую функцию, которая переключает «/» на «\». Затем задокументируйте пользователю, что он должен указывать пути как пути Linux, и это преобразование будет применено к окнам.
  7. Создайте для этого свой собственный мини-язык путей и документируйте его для пользователя. Например: "/" - указывает разделитель каталогов, {root} - расширяется до корня файловой системы, {cwd} - расширяется до текущего каталога, {app} - расширяется до пути к вашему приложению и т. д. Затем пользователь может указать пути к файлам, например: {root}/myfiles/bob.txt на обеих платформах.
  8. Некоторые пути будут работать на обеих платформах. Например: относительные пути, такие как ../my files/bill.txt. Ограничьте свое приложение, чтобы оно работало только с этими путями. Задокументируйте это ограничение и то, как ваше приложение обрабатывает пути к пользователю.
person user1976    schedule 06.12.2016