我想在与程序相同的路径中创建一个目录,最终将数据保存到。为此,我需要由预处理器分支包围的OS特定调用,但在此之前我从未编写过任何特定于操作系统的代码。我不确定我需要包含哪些标头,或者从中使用哪些功能。
如果操作系统是Windows,Mac和Linux(无论哪种方法都适用于大多数Linux发行版),我应该使用哪些函数和标题?
我不想使用boost文件系统的原因是,我整天都难以编译它;它的文档和构建系统对我的简单灵魂似乎过于学术/冗长!最终,我认为维护3或4个单独的文件加载分支对我来说会更快。
答案 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),您可以使用某些多平台框架库,如POCO或Qt
然后,如果您想要POSIX特定功能来创建目录,请使用mkdir功能。在Linux上,它是mkdir(2)系统调用(在syscalls(2) ...中列出)。该文档说明了应包含哪些标头,它是Linux上C standard library的一部分。
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标准(即使您可以从MicroSoft购买符合POSIX标准的套件)
也许Windows上也有mkdir
....
另请注意&#34;在与我的程序相同的路径中创建一个目录&#34;很暧昧。您可以在多个processes中运行您的程序,每个working directory具有不同的当前Filesystem Hierarchy Standard。并且经常(至少在Linux上)可执行程序安装在/usr/local/bin/
中提到的某个目录(例如/usr/bin/
,$HOME/bin/
或PATH
)中,但大多数程序都无法写入。阅读有关persist的更多信息。因此,我在您的程序所在的目录中赢得了application checkpointing您的软件数据。此外,您可以使用sqlite或使用PostGreSQL或其他内容保持您的数据(MongoDB,JSON,{{3}},...)