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

Posted

技术标签:

【中文标题】如何在不使用 boost 的情况下创建目录?【英文标题】:How to create a directory without using boost? 【发布时间】:2015-01-11 07:32:33 【问题描述】:

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

如果操作系统是 Windows、Mac 和 Linux(无论如何都适用于大多数 linux 发行版),我应该使用哪些函数和头文件?

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

【问题讨论】:

【参考方案1】:

在所有 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

【讨论】:

_mkdir 要求包含标头 &lt;direct.h&gt;。还值得注意的是,有一个支持 Unicode 的版本_wmkdir,它允许可靠地创建包含 ASCII 范围之外的字符的目录。【参考方案2】:

首先,如果您想编写跨平台代码(适用于所有 Linux、Windows、MacOSX),您可能会使用一些多平台框架库,例如 POCO 或 Qt

然后,如果你想POSIX 特定函数创建一个目录,使用mkdir 函数。在 Linux 上,它是 mkdir(2) 系统调用(在 syscalls(2)... 中列出)。该文档解释了应包含哪些标头,它是 Linux 上 C standard library 的一部分。

顺便说一句,在大多数 Linux 发行版上,您通常不需要编译 Boost;在类似 Debian 的发行版(例如 Ubuntu)上,您可以使用 aptitude install libboost-all-devapt-get install libboost-all-dev 安装 libboost-all-dev 元包(所有与 boost 相关的库,用于开发)

要了解 Linux 编程的概述,请阅读Advanced Linux Programming

另外,gcc(和其他 C 或 C++ 编译器)预定义了一组预处理器符号。见this answer。因此,在您的代码中,您可以简单地使用 #if linux ... #endif 来包装特定于 Linux 的代码。

还要注意 POSIX 是一个标准规范:您应该能够在所有 POSIX 兼容的操作系统(特别是 Linux、*BSD、Solaris、MacOSX)上编译相同代码。遗憾的是,Windows 不兼容 POSIX(即使您可以从 MicroSoft 购买兼容 POSIX 的套件)

也许mkdir 在 Windows 上也可用....

另请阅读feature_test_macros(7)


另请注意,“在与我的程序相同的路径中创建一个目录”是不明确的。您可以在多个processes 中运行您的程序,每个都有不同的电流working directory。并且经常(至少在 Linux 上)可执行程序安装在您的 PATH 中提到的某个目录(例如 /usr/local/bin//usr/bin/$HOME/bin/)中,但大多数程序无法写入。阅读有关Filesystem Hierarchy Standard 的更多信息。所以我不会persist你的软件数据和你的程序在同一个目录下。此外,您可以使用application checkpointing 或使用sqlite 或其他方式(PostGreSQL、MongoDB、JSON、...)保存数据

【讨论】:

以上是关于如何在不使用 boost 的情况下创建目录?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 boost::promise 的情况下在 boost 线程中返回值

如何在不创建父目录的情况下使用 wget 镜像目录?

java - 如何在不创建对象的情况下找出文件和目录的大小?

如何在不接触该目录中的文件的情况下查找文件夹更改(使用 Windows 和 C++)

在不使用资产目录的情况下命名启动图像

如何在不使用电子锻造重定向到根目录的情况下进行热重装并做出反应