C++创建带当日日期的子目录时运行报语法错误及mkdir()使用问题
问题解答
原代码报错原因
- 字符串逻辑错误:你在构造shell命令时,把
ss.str()直接写死成了字符串的一部分,没有把它对应的格式化日期值拼接进命令,最终实际执行的是mkdir -p Anita_/ss.str(),目标目录名就是字面的ss.str() - shell语法冲突:shell中
()是特殊控制字符,未转义直接出现在命令中时,就会抛出sh: 1: Syntax error: "(" unexpected的报错
能否用mkdir()替代system()接口?
完全可以,这种原生系统调用的方式比调用shell接口更安全、可控性更强,刚好能实现你想要的按路径+指定权限创建目录的效果,仅需注意两点差异:
- POSIX标准的
mkdir()函数仅支持创建单级目录,如果目标路径的父目录不存在,会直接返回错误。你当前的代码逻辑已经提前创建了Anita_根目录,所以不存在这个问题 - 原生
mkdir()没有mkdir -p的递归创建能力,如果后续需要创建多级嵌套目录,需要额外做路径逐层级的存在性判断,或者用C++17提供的std::filesystem::create_directories接口实现递归创建
正确实现示例
你原本设想的通过mkdir()创建带日期的子目录的思路完全可行,只是要注意不能把ss.str().c_str()的代码直接写进路径字符串的字面量里,需要先通过C++逻辑拼接出完整路径,再传给mkdir接口。直接把原来调用system()的部分替换成如下代码即可:
// 拼接完整的子目录路径:父目录 + 格式化后的日期字符串 std::string dir_path = "Anita_/" + ss.str(); // 调用mkdir创建目录,权限按照你的要求设置为0700 if (mkdir(dir_path.c_str(), 0700) == -1) { cerr << "子目录创建失败:" << strerror(errno) << endl; } else { cout << "子目录创建成功" << endl; }
补充优化点
- 不要再依赖字符串拼接构造shell命令,避免特殊字符转义、shell注入、不同环境shell语法兼容的问题
- 原代码中引入的
bits/stdc++.h是GCC编译器特有的非标准头文件,跨平台编译时会出错,正式代码中不建议使用
内容的提问来源于stack exchange,提问作者Anita Shukla
相关产品推荐
相关产品推荐

