如何在不使用boost的情况下创建目录?

时间:2015-01-11 07:32:34

标签: c++ linux windows macos file-io

我想在与程序相同的路径中创建一个目录,最终将数据保存到。为此,我需要由预处理器分支包围的OS特定调用,但在此之前我从未编写过任何特定于操作系统的代码。我不确定我需要包含哪些标头,或者从中使用哪些功能。

如果操作系统是Windows,Mac和Linux(无论哪种方法都适用于大多数Linux发行版),我应该使用哪些函数和标题?

我不想使用boost文件系统的原因是,我整天都难以编译它;它的文档和构建系统对我的简单灵魂似乎过于学术/冗长!最终,我认为维护3或4个单独的文件加载分支对我来说会更快。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

首先,如果您想编写跨平台代码(适用于所有Linux,Windows,MacOSX),您可以使用某些多平台框架库,如POCOQt

然后,如果您想要POSIX特定功能来创建目录,请使用mkdir功能。在Linux上,它是mkdir(2)系统调用(在syscalls(2) ...中列出)。该文档说明了应包含哪些标头,它是Linux上C standard library的一部分。

BTW,在大多数Linux发行版中,您通常不需要编译 Boost;在类似Debian的发行版(例如Ubuntu)上,您可以使用libboost-all-devaptitude 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标准(即使您可以从MicroSoft购买符合POSIX标准的套件)

也许Windows上也有mkdir ....

另请阅读feature_test_macros(7)


另请注意&#34;在与我的程序相同的路径中创建一个目录&#34;很暧昧。您可以在多个processes中运行您的程序,每个working directory具有不同的当前Filesystem Hierarchy Standard。并且经常(至少在Linux上)可执行程序安装在/usr/local/bin/中提到的某个目录(例如/usr/bin/$HOME/bin/PATH)中,但大多数程序都无法写入。阅读有关persist的更多信息。因此,我在您的程序所在的目录中赢得了application checkpointing您的软件数据。此外,您可以使用sqlite或使用PostGreSQL或其他内容保持您的数据(MongoDBJSON,{{3}},...)