Как создать каталог без использования boost?

0

Я хочу создать каталог по тому же пути, что и моя программа, чтобы в конечном итоге сохранить данные. Для этого мне нужны специальные вызовы ОС, окруженные ветвями препроцессора, но до этого момента я никогда не писал код конкретной ОС. Я не знаю, какие заголовки мне нужно включить или какие функции использовать от них.

Если ОС - это Windows, Mac и Linux (какой бы метод не работал для большинства дистрибутивов Linux), какие функции и заголовки я должен использовать?

Причина, по которой я не хочу использовать форсированную файловую систему, заключается в том, что я с трудом собирал ее весь день; это документация и система сборки, слишком академичная/многословная для моей простой души! В конечном счете, я считаю, что поддержка 3 или 4 отдельных разделов загрузки файлов будет быстрее для меня.

Теги:
macos
file-io

2 ответа

3

На всех Unix-системах (Linux, Mac OS X и т.д.) Вы должны вызвать mkdir с двумя аргументами:

mkdir(filename, 0755);

В Windows вы хотите использовать _mkdir только с одним аргументом:

_mkdir(filename);

Поэтому ваш код должен сказать:

#ifdef WIN32
#include <direct.h>
rc = _mkdir(filename);
#else
#include <sys/stat.h>
rc = mkdir(filename, 0755);
#endif
  • 0
    _mkdir требует, чтобы заголовок <direct.h> был включен. Стоит также отметить, что существует версия _wmkdir , которая позволяет надежно создавать каталоги с символами вне диапазона ASCII.
  • 0
    @ Неплохо, верно. Ред.
2

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

Затем, если вы хотите, чтобы специальная функция POSIX создавала каталог, используйте функцию mkdir. В Linux это системный вызов mkdir (2) (указанный в syscalls (2)...). Документация объясняет, какие заголовки должны быть включены, и является частью стандартной библиотеки C в Linux.

BTW, в большинстве дистрибутивов Linux вам часто не нужно компилировать Boost; на Debian-подобных дистрибутивах (например, Ubuntu) вы можете установить мета-пакет libboost-all-dev (все связанные с расширением библиотеки для разработки), используя aptitude install libboost-all-dev или apt-get install libboost-all-dev

Чтобы получить обзор программирования Linux, прочитайте Advanced Linux Programming

Кроме того, gcc (и другие компиляторы C или C++) предопределяет набор символов препроцессора. См. Этот ответ. Таким образом, в вашем коде вы можете просто использовать #if linux... #endif для переноса кода, специфичного для Linux.

Также обратите внимание, что POSIX является стандартной спецификацией: вы должны иметь возможность компилировать один и тот же код во всех совместимых с POSIX операционных системах (в частности, Linux, * BSD, Solaris, MacOSX). К сожалению, Windows не совместима с POSIX (даже если вы можете купить комплект, совместимый с POSIX от MicroSoft)

Возможно, mkdir доступен и для Windows...

Читайте также feature_test_macros (7)


Также обратите внимание, что "создать каталог по тому же пути, что и моя программа", является неоднозначным. Вы можете запускать свою программу в нескольких процессах, каждый из которых имеет другой текущий рабочий каталог. И довольно часто (по крайней мере, в Linux) исполняемая программа устанавливается в какой-то каталог (например, /usr/local/bin/, /usr/bin/ или $HOME/bin/), упомянутый в вашей PATH но не поддающийся большинству программ. Подробнее о стандарте иерархии файловой системы. Поэтому я не буду сохранять ваши данные программного обеспечения в том же каталоге, что и ваша программа. Кроме того, вы можете использовать контрольную точку приложения или сохранять свои данные, используя sqlite или что-то еще (PostGreSQL, MongoDB, JSON ,...)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню