переносимость пути к файлу - PullRequest
1 голос
/ 11 ноября 2008

У меня есть программа, которую мне нужно запустить под * nix и windows. поскольку программа берет пути файлов из файлов, проблема заключается в том, что делать с проблемой \ vs /.

Моя текущая мысль состоит в том, чтобы вставить регулярное выражение, которое преобразует неправильное в правильное в зависимости от того, в какой системе я работаю. Это даст возможность любому типу работать в любой системе. Помимо того, что сейчас у меня две проблемы , кто-нибудь видит другие проблемы?

(Другие лучшие решения приветствуются)

Редактировать: основная проблема - заставить Windows работать с Unix, а не наоборот.

Ответы [ 7 ]

5 голосов
/ 11 ноября 2008

/ также полностью поддерживается в win32.

Также смотрите этот связанный вопрос

1 голос
/ 11 ноября 2008

Обратите внимание, что пути Win32 сложны, если учесть буквы дисков (нет аналога в Unix) и специальные «вилки» (термин MacOS pre-X - аналога вообще нет в Unix, хотя в MacOS X они есть - удивление, удивление ) это может быть предоставлено. Будьте осторожны.

1 голос
/ 11 ноября 2008

Рассматривали ли вы создание класса "файловый менеджер", который будет решать все проблемы с файловыми путями для вас? Таким образом, в вашем почтовом приложении, когда вы загружаете файл данных, вы можете вызвать что-то вроде этого.

LoadApplicationData(FileManager.GetDataFilePath)

Тогда ваш файловый менеджер обнаружит среду, в которой он находится, и вернет правильный путь к файлу. Таким образом, вы также можете приспосабливаться к стандартам Win32 и Unix (например, Program Files vs / usr и т. Д.).

1 голос
/ 11 ноября 2008

Windows обычно принимает \ или /, поэтому стандартизация на / может упростить вашу проблему, если вы полностью контролируете имена файлов.

0 голосов
/ 06 декабря 2016

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

Вы не сказали, какой язык вы используете, поэтому я собираюсь эгоистично предположить c / c ++. boost , если вы хотите его использовать, имеет библиотеку файловой системы . Конечно, если вы используете динамический язык, библиотеки абстракции FS, вероятно, уже существуют там (например, в perl, File :: Spec вполне стандартен).

0 голосов
/ 11 ноября 2008

Создайте парсер для вашего ввода, чтобы создать древовидную структуру узлов, представляющих каталоги. Затем вы можете «сохранить», пройдясь по дереву и записав любые разделители, которые вы хотите, или, по выбору, выполняя разные действия, например, проверяя, существует ли каталог или записывая метафайлы. На самом деле это то, что я сейчас думаю, будет полезно для моего собственного приложения: -)

...