You need to enable JavaScript to run this app. C++创建带当日日期的子目录时运行报语法错误及mkdir()使用问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.08 20:54:06