Какой хороший кроссплатформенный способ объединения путей в C? - PullRequest
4 голосов
/ 06 октября 2011

На данный момент у меня есть функция path_concat(char* path_fragment_a, char* path_fragment_b), которая просто объединяет вместе path_fragment_a, PATH_DIVIDER и path_fragment_b. (PATH_DIVIDER определяется # в блоке #ifdef, поэтому \ для Windows и / везде.)

Но я не могу не думать, что это кажется:

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

Поиск в Google просто дал много результатов о os.path.join Python (который был бы идеальным, , за исключением того, что это Python, а не C ), поэтому мне было интересно, если кто-нибудь знал о более чистом / более стандартное решение.

Ответы [ 3 ]

6 голосов
/ 06 октября 2011

Прежде всего, вы должны использовать snprintf, а не операции конкатенации, чтобы создать строку сразу. Это безопасный и эффективный способ. Конкатенация может быть идиоматичной в скриптовых языках, но она неэффективна и вредна (подвержена опасным ошибкам) ​​в C.

С учетом вышесказанного, начиная с первой версии DOS, в которой были каталоги (2 или 3; я забыл, как это было), '/' был действительным в качестве разделителя пути в DOS и всегда действительным в Windows также. Единственная причина, по которой он не использовался, заключается в том, что многие устаревшие программы командной строки, разработанные до того, как каталоги, поддерживаемые DOS, интерпретируют '/' как символ «переключателя» (опция) при разборе командной строки. За последние 20 лет единственной реальной системой, которая не поддерживала '/' в качестве разделителя пути, является MacOS до OSX, и я не думаю, что это более жизнеспособная цель, поэтому, на мой взгляд, вы должны просто всегда использовать '/', и избегайте загрязнения вашего кода необоснованной переносимостью.

1 голос
/ 06 октября 2011

Очевидно, у GLib есть некоторые функции (например, g_build_path) и макросы (G_DIR_SEPARATOR_S и другие) для этого.

1 голос
/ 06 октября 2011

К сожалению, в стандартной библиотеке C нет такой функции для объединения путей к файлам. Вам придется сделать это вручную.

...