Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: SuperpolockОтветов: 4

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

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

windowsc++linuxcross-platformgnu

Ответы

Ответ 1 · рейтинг 18 · Adam Rosenfield

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

Ответ 2 · рейтинг 13 · gbjbaanb

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

Ответ 3 · рейтинг 5 · Jonas Engström

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

Ответ 4 · user1976

Есть много способов, ИМХО, правильный ответ - изменить дизайн вашей программы, чтобы избежать манипулирования путями. Я разместил ответ здесь: 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. Ограничьте свое приложение, чтобы оно работало только с этими путями. Задокументируйте это ограничение и то, как ваше приложение обрабатывает пути к пользователю.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы