Как создать независимый от ОС путь в С++

У меня есть путь назначения и имя файла в виде строк, и я хочу объединить их с помощью С++.

Есть ли способ сделать это и позволить программе/компилятору выбирать между / и \ для систем Windows или Unix?


person Janusz    schedule 29.06.2009    source источник


Ответы (4)


Если вы хотите сделать это во время компиляции, вы, безусловно, можете сделать что-то вроде

#ifdef WIN32
#define OS_SEP '\\'
#else
#define OS_SEP '/'
#endif

Или вы можете просто использовать '/', и все будет отлично работать в Windows (за исключением старых программ, которые анализируют строку и работают только с '\'). Это выглядит забавно только в том случае, если отображается для пользователя таким образом.

person jcopenha    schedule 29.06.2009
comment
Я еще не тестировал его с машиной Windwos, но если он работает, мне этого достаточно. - person Janusz; 29.06.2009
comment
Насколько это возможно, это сработает. Имейте в виду, что пути DOS могут начинаться с буквы диска и двоеточия (в противном случае они относятся к текущему диску). И остерегайтесь альтернативных «форков» и имен устройств. - person Jonathan Leffler; 29.06.2009
comment
Windows на самом деле в порядке с косой чертой. - person Jim Buck; 30.06.2009
comment
Wiki говорит, что есть также ':' и '›' и '. ' допустимые разделители каталогов в некоторых ОС. - person ASten; 18.04.2013

Как это часто бывает, у Boost есть библиотека, которая делает то, что вы хотите. Вот учебник.

person David Seiler    schedule 29.06.2009
comment
Неужели мне нужна целая библиотека для выбора между / и \? - person Janusz; 29.06.2009
comment
Нет, но это не единственная разница между именами файлов в DOS и Unix. Действительно, косая черта принимается DOS (как и обратная косая черта), но не интерпретатором команд cmd.exe. - person Jonathan Leffler; 29.06.2009
comment
Boost — это практически стандартная библиотека C++. Это не просто целая библиотека. - person rlbond; 29.06.2009
comment
Правильный ответ. Может быть, есть библиотеки меньшего размера, но возиться с '\' и '/' - это путь безрассудного падавана. - person David Tonhofer; 03.08.2015

Используйте '/' везде внутри. Затем напишите набор служебных функций, которые импортируют путь любой формы в использование '/'. Напишите функцию «собственного пути», которая имеет специфичные для системы ifdef и необходимые преобразования. который можно вызвать по запросу.

person Brian    schedule 30.06.2009

Один из простых способов сделать то, о чем вы просили, — создать небольшую (вероятно встроенную) функцию, которая использует магию препроцессора для определения платформы (#ifdef WIN32 и т. д.) и возвращает соответствующий символ-разделитель.

Ответ немного сложнее, потому что есть и другие более существенные отличия, чем символ-разделитель. Файловые системы Windows могут иметь несколько корней (C:\, D:\ и т. д.), в то время как вся ФС коренится в / в Unix-стране.

Лучшим советом может быть использование boost::filesystem. .

person Drew Hall    schedule 29.06.2009