Несоответствие Windows и Linux: обратная косая черта и прямая косая черта в C ++ - PullRequest
0 голосов
/ 16 ноября 2018

В Windows у меня есть

std::string graphdir = projDir + "graph\\";
int mkdirsf=_mkdir(graphdir.c_str());

Вышеуказанное работает довольно хорошо в Windows.Но в Linux вы знаете, что используется наклонная черта /.Таким образом, выше будет создать папку с именем graph\.Есть ли универсальный способ ввести правильную папку, не беспокоясь о / или \?

1 Ответ

0 голосов
/ 16 ноября 2018

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

В противном случае обратите внимание, что C ++ 11 (или C ++ 14) стандарт не знает о «папках» (вы на самом деле имеете в виду каталоги ; поскольку папки являются только артефактом графического интерфейса; прочитайте, например, n3337 , чтобы проверить).C ++ 17 имеет std :: filesystem .

Возможно, вам следует рассмотреть некоторые другие библиотеки или фреймворки: Boost , POCO , Qt все знают, как обращаться с каталогами в распространенных ОС (Windows, Linux, MacOSX, Android).

Более серьезное беспокойство вызывает буква "диск".Для Windows (и даже для некоторых MS-DOS) C:/FOO/BAR.TXT (или, используя обратную косую черту, C:\FOO\BAR.TXT) и D:/FOO/BAR.TXT относятся к разным файлам.В Linux или MacOSX нет реального эквивалента.Так как точки монтирования являются более общими.

Наконец, соглашения об файловой иерархии (и файловых системах) широко варьируются от одной ОС к другой.Для Linux см. hier (7) и path_resolution (7) .Обратите внимание, что globbing также зависит от ОС (и происходит иначе: в системах Unix это часто выполняется shell ; в Windows это может быть сделано в каждом приложении некоторыми crt0 как в системе ).Для Linux см. Также glob (7) .

Кстати, возможно, вы могли бы рассмотреть возможность использования WSL на вашем компьютере с Windows.В удачных случаях один и тот же исполняемый файл может работать в Linux и Windows (под WSL), и это облегчает вашу работу (когда ее можно использовать).

Найдите время, чтобы узнать больше о операционные системы и файловые системы .Я рекомендую Операционная система: Three Easy Pieces учебник (можно бесплатно загрузить).

Вы можете найти полезную информацию о вашей ОС.Для Linux прочитайте ALP (или более новую книгу), затем syscalls (2) и intro (3) и т. Д. ... Для Windows изучите WinAPI (я не знаю), возможно, запустив здесь .

В Linux API, относящийся к каталогам, включает mkdir (2) , chdir (2) , rmdir (2) , getcwd (2) , stat (2) , opendir (3) и closedir, readdir (3) , nftw (3) , и т. Д. И т. Д. .... Имейте в виду, что файл в Linux является просто i-node (читать inode (7) и около жестких ссылок ) и может находиться в нескольких каталогах (или ни одного), см. ссылка (2) .AFAIU, это делает огромную разницу с Windows.

PS.Я никогда не использовал Windows и никогда не кодировал ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...