Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

LoadApplicationData(FileManager.GetDataFilePath)

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

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

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

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

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

способами:

<Ол>
  • Добавьте параметр командной строки, который позволяет пользователю указывать нужный путь вместо чтения его из файла конфигурации.
  • Добавьте параметр командной строки, чтобы пользователь мог указать базовый путь. Пути в файле конфигурации будут интерпретироваться как расположенные под этим базовым путем.
  • Разделите ваш конфигурационный файл на три части. Один файл будет иметь кроссплатформенную конфигурацию, другой файл будет иметь конфигурацию только для Windows, а конечный файл будет иметь конфигурацию только для Linux. Затем пользователь может указать правильный путь для Windows и Linux. В Windows ваша программа будет читать кросс-платформенный конфигурационный файл и конфигурационный файл только для Windows. В Linux он будет читать кроссплатформенный файл и только конфигурационный файл Linux.
  • Добавьте предварительную обработку в ваш файл конфигурации. Это позволит вам иметь один конфигурационный файл, в котором пользователь может заставить вашу программу игнорировать некоторые строки в файле в зависимости от того, на какой ОС запущена программа. Таким образом, пользователь сможет указать путь к файлу дважды. Один раз для Linux и один раз для Windows.
  • Измените дизайн так, чтобы файлы всегда находились в том же каталоге, что и ваш исполняемый файл - тогда пользователь указывает только имена файлов в файле конфигурации, а не пути к файлам.
  • Используйте простую функцию, которая переключает " / " на " \ " ;. Затем сообщите пользователю, что они должны указать пути в виде путей Linux, и это преобразование будет применено для окон.
  • Создайте для этого собственный мини-язык пути и задокументируйте его для пользователя. Например: "/" - указывает разделитель каталогов, {root} - расширяется до корня файловой системы, {cwd} - расширяется до текущего каталога, {app} - расширяется до пути к вашему приложению и т. д. ... Затем пользователь может указать пути к файлам например: {root} /myfiles/bob.txt на обеих платформах.
  • Некоторые пути будут работать на обеих платформах. Например: относительные пути, такие как ../my files / bill.txt. Ограничьте ваше приложение, чтобы работать только с этими путями. Задокументируйте это ограничение и то, как ваше приложение обрабатывает пути к пользователю.
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top