如何在不使用 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
要求包含标头 <direct.h>
。还值得注意的是,有一个支持 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-dev
或 apt-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 线程中返回值
java - 如何在不创建对象的情况下找出文件和目录的大小?