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缓存驱动和应用优化方案