C++ 怎么重命名文件 C++ rename函数修改文件名代码【文件】
发布时间 - 2026-01-27 00:00:00 点击率:次rename是C标准库函数,非C++标准,需包含,路径用C字符串,不跨文件系统,不覆盖目标;C++17推荐用std::filesystem::rename。
rename 函数在 C++ 中直接可用,但行为依赖底层系统
rename 不是 C++ 标准库函数,而是来自 C 标准库 (或 C 头文件 ),C++ 程序中可直接调用。它的签名是:int rename(const char* oldname, const char* newname);。返回 0 表示成功,非 0 表示失败(具体错误码需查 errno)。
注意:它不支持跨文件系统移动,也不能覆盖已存在的目标文件(在 Windows 上可能允许,Linux/macOS 默认不允许)。
- 路径必须是 C 风格字符串(
const char*),不能直接传std::string,需用.c_str() - 如果
newname已存在,多数 POSIX 系统会失败并置errno = EEXIST;Windows 的rename可能静默覆盖(行为不一致,不可依赖) - 源和目标必须在同一个挂载点(同磁盘分区),否则返回 -1 且
errno = EXDEV
跨平台安全重命名要先检查目标是否存在
因为 rename 对已存在目标的处理不统一,生产代码中应显式判断并决定是否覆盖:
#include#include #include // for stat on POSIX #include // for _access on Windows
bool safe_rename(const std::string& oldpath, const std::string& newpath, bool overwrite = false) { // 先检查目标是否存在
ifdef _WIN32
if (_access(newpath.c_str(), 0) == 0) {else
struct stat st; if (stat(newpath.c_str(), &st) == 0) {endif
if (!overwrite) return false; // 尝试删除已有文件(仅当有权限时) if (std::remove(newpath.c_str()) != 0) return false; } return std::rename(oldpath.c_str(), newpath.c_str()) == 0;}
立即学习“C++免费学习笔记(深入)”;
这段逻辑绕开了
rename的模糊语义,把“覆盖”控制权交还给调用者。更现代的替代方案:C++17
std::filesystem::rename如果你的编译器支持 C++17(如 GCC 8+、Clang 7+、MSVC 2017 Update 5+),强烈推荐用
std::filesystem:
- 接口统一:
std::filesystem::rename(old_p, new_p)抛出std::filesystem::filesystem_error异常,错误信息更明确- 自动处理路径分隔符(
/或\)和编码细节- 支持跨文件系统移动(本质是 copy + unlink,但对用户透明)
- 可配合
std::filesystem::exists()、std::filesystem::status()做前置判断启用方式:编译时加
-std=c++17(GCC/Clang),MSVC 默认开启;链接时可能需要-lstdc++fs(GCC)或确保 VS 版本足够新。常见错误和调试线索
调用
rename失败时,别只看返回值,务必检查errno:
ENOENT:源路径不存在,或目标父目录不存在(rename("a.txt", "dir/b.txt")中dir/不存在)EACCES:权限不足(源/目标目录不可写,或源文件被其他进程独占打开)EXDEV:源和目标不在同一设备——此时只能用复制+删除组合实现EISDIR/ENOTDIR:路径类型错配(比如把文件重命名为目录名,或反之)Windows 下尤其要注意:如果目标文件正被记事本、资源管理器预览窗格或防病毒软件占用,
rename会失败且errno可能为 13(EACCES)而非更直观的错误码。
# linux # windows # 编码 # access # mac # c++ # macos # 资源管理器 # win # 防病毒软件 # cos # String # Filesystem # const # 字符串 # errno # char # int # 风格字符串 # 接口 # copy # 不存在 # 文件系统 # 是否存在 # 已有 # 错误码 # 这段 # 要注意 # 要先 # 但对 # 可直接
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: 微信小程序 闭包写法详细介绍 Laravel如何发送系统通知?(Notification渠道示例) 东莞市网站制作公司有哪些,东莞找工作用什么网站好? 高端建站如何打造兼具美学与转化的品牌官网? 如何用美橙互联一键搭建多站合一网站? 如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环 胶州企业网站制作公司,青岛石头网络科技有限公司怎么样? zabbix利用python脚本发送报警邮件的方法 如何在IIS中新建站点并配置端口与物理路径? Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境 如何在阿里云虚拟主机上快速搭建个人网站? 微信小程序 scroll-view组件实现列表页实例代码 实例解析angularjs的filter过滤器 Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程 Laravel如何集成Inertia.js与Vue/React?(安装配置) Claude怎样写结构化提示词_Claude结构化提示词写法【教程】 悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音 如何在Windows环境下新建FTP站点并设置权限? JavaScript实现Fly Bird小游戏 Laravel如何使用Livewire构建动态组件?(入门代码) 专业商城网站制作公司有哪些,pi商城官网是哪个? 再谈Python中的字符串与字符编码(推荐) Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南 Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程 如何确保西部建站助手FTP传输的安全性? Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】 网站建设整体流程解析,建站其实很容易! 如何在宝塔面板创建新站点? Python函数文档自动校验_规范解析【教程】 如何用AI帮你把自己的生活经历写成一个有趣的故事? Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】 北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱? 如何注册花生壳免费域名并搭建个人网站? Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践 如何构建满足综合性能需求的优质建站方案? 浅谈Javascript中的Label语句 Python企业级消息系统教程_KafkaRabbitMQ高并发应用 进行网站优化必须要坚持的四大原则 Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧 Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程 悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】 用v-html解决Vue.js渲染中html标签不被解析的问题 Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控 Laravel如何生成URL和重定向?(路由助手函数) Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析 Laravel storage目录权限问题_Laravel文件写入权限设置 微信小程序 input输入框控件详解及实例(多种示例) 为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】 如何在景安服务器上快速搭建个人网站? Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案


