2015-01-11 2 views
0

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

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

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

ответ

2

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

Затем, если вы хотите POSIX конкретные функцию для создания каталога, используйте функцию mkdir. В Linux это mkdir(2) syscall (указан в syscalls(2) ...). Документация объясняет, какие заголовки должны быть включены, и является частью C standard library в 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++) предопределяет набор символов препроцессора. См. this answer. Поэтому в вашем коде вы можете просто использовать #if linux ... #endif, чтобы обернуть код, специфичный для Linux.

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

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

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


Обратите внимание, что «создать каталог в том же пути, что и моя программа», является неоднозначным. Вы можете запустить свою программу в нескольких processes, каждый из которых имеет разный ток working directory. И довольно часто (по крайней мере, в Linux) исполняемая программа устанавливается в какой-то каталог (например, /usr/local/bin/, /usr/bin/ или $HOME/bin/), упомянутый в вашем PATH, но не поддающийся большинству программ. Узнайте больше о Filesystem Hierarchy Standard. Поэтому я не буду persist ваши данные программного обеспечения в том же каталоге, что и ваша программа. Кроме того, вы можете использовать application checkpointing или сохраняете свои данные, используя sqlite или что-то еще (PostGreSQL, MongoDB, JSON, ...)

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' требует заголовок' 'для включения. Также стоит отметить, что существует версия Unixode '_wmkdir', которая позволяет надежно создавать каталоги с символами вне диапазона ASCII. – IInspectable

+0

@ Незначительный, правый. Ред. – jch