如何使用 _mkdir 在 C++ 中创建目录

3
今天我在网上做了很多关于如何在C++中创建目录的研究,找到了许多方法,有些比其他方法更容易。
我尝试使用_mkdir函数来创建一个文件夹,例如_mkdir("C:/Users/...");。请注意,函数参数将被转换为const char*
到目前为止,一切都好,但是当我想要更改路径时,它不起作用(请参见下面的代码)。我有一个默认字符串路径"E:/test/new",我想创建10个子文件夹:new1new2newN,...,new10
为此,我使用static_cast将字符串与数字(for循环计数器)连接起来,然后使用c_str()转换字符串,将其分配给一个const char*变量。
编译器没有问题,但是它不起作用。它打印10次"Impossible create folder n"。错在哪里?
我可能在使用c_str()将字符串转换为const char*时犯了一个错误。
另外,是否有其他方法可以创建文件夹?我查看了CreateDirectory();(API),但它使用像DWORD HANDLE这样的关键字,这对于初学者来说有点难以理解(我不知道这些是什么意思)。
#include <iostream>
#include <Windows.h>
#include<direct.h>

using namespace std;

int main()
{
int stat;
string path_s = "E:/test/new";

for (int i = 1; i <= 10; i++)
{
    const char* path_c = (path_s + static_cast<char>(i + '0')).c_str();
    stat = _mkdir(path_c);

    if (!stat)
        cout << "Folder created " << i << endl;
    else
        cout << "Impossible create folder " << i << endl;
    Sleep(10);
}
return 0;
}

2
i == 10 时,i + '0' 的效果不是很好。也许你应该使用 std::to_string 代替? - Some programmer dude
而且Windows CreateDirectoryA函数非常易于使用:将路径作为第一个参数传递,将空指针作为第二个参数传递。 - Some programmer dude
2
你可能会对新的(C++17)文件系统库感兴趣,你将不再依赖于(非标准!)mkdir... - Aconcagua
“E:/test” 存在吗?我相信 _mkdir 只会创建一个目录层级。 - Martin Bonner supports Monica
3个回答

7
如果你的编译器支持C++17,你可以使用文件系统库实现你想要的功能。
#include <filesystem>
#include <string>
#include <iostream>

namespace fs = std::filesystem;

int main(){
    const std::string path = "E:/test/new";
    for(int i = 1; i <= 10; ++i){
        try{
            if(fs::create_directory(path + std::to_string(i)))
                std::cout << "Created a directory\n";
            else
                std::cerr << "Failed to create a directory\n";\
        }catch(const std::exception& e){
            std::cerr << e.what() << '\n';
        }
    }
    return 0;
}

4
问题在于 (path_s + static_cast<char>(i + '0')) 会创建一个临时对象,这个对象的生命周期在调用 c_str() 后就结束并被销毁了。
这样留下来的是指向不存在的字符串的指针,而几乎任何使用它的方式都会导致未定义行为
相反,应该保存 std::string 对象,并且只在需要时才调用 c_str()
std::string path = path_s + std::to_string(i);
_mkdir(path.c_str());

2

请注意,在Linux下,您可以使用以下命令来创建目录:

mkdir

#include <sys/stat.h>
... 
const int dir_err = mkdir("foo", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
if (-1 == dir_err){
    printf("Error creating directory!n");
    exit(1);
}

更多关于此的信息可以从阅读"man 2 mkdir"中获得。原始答案为"最初的回答"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接