在C++开发中,重命名文件是常见的文件操作需求,既可以通过传统的C标准库函数实现,也可以借助C++17之后引入的filesystem标准库完成,两种方法各有适用场景。

C标准库rename函数实现文件重命名
C标准库提供了rename函数用于重命名文件,该函数在stdio.h头文件中声明,兼容性较好,支持C++98及以上版本。
函数原型与参数说明
rename函数的原型为:
int rename(const char *old_filename, const char *new_filename);
参数含义如下:
old_filename:原文件的路径和名称,支持相对路径和绝对路径new_filename:新文件的路径和名称,如果新路径和原路径不同,还可以实现文件移动的效果
函数返回值:成功返回0,失败返回非0值,错误码可以通过errno获取。
基础使用示例
以下代码演示了使用rename函数重命名当前目录下的文件:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
const char *old_name = "old_test.txt";
const char *new_name = "new_test.txt";
// 调用rename函数重命名文件
int result = rename(old_name, new_name);
if (result == 0) {
printf("文件重命名成功n");
} else {
printf("文件重命名失败,错误原因:%sn", strerror(errno));
}
return 0;
}
注意事项
- 如果新文件名已经存在,
rename函数的行为取决于操作系统,Windows下会失败,Linux下会覆盖原文件 - 如果原文件不存在,函数会返回失败
- 需要操作跨目录的文件时,需要保证路径的合法性,且程序有足够的权限访问对应路径
C++17 filesystem库实现文件重命名
C++17标准引入了filesystem库,提供了更面向对象的文件系统操作接口,重命名文件可以通过rename函数完成,该函数在std::filesystem命名空间下。
函数原型与参数说明
std::filesystem::rename的常用原型为:
void rename(const path& old_p, const path& new_p); void rename(const path& old_p, const path& new_p, error_code& ec) noexcept;
参数含义如下:
old_p:原文件的路径,类型为std::filesystem::path,可以接收字符串直接构造new_p:新文件的路径,类型同样为std::filesystem::pathec:可选的错误码参数,传入后函数不会抛出异常,错误信息会存储到该参数中
基础使用示例
以下代码演示了使用std::filesystem::rename重命名文件:
#include <filesystem>
#include <iostream>
#include <string>
int main() {
std::string old_path = "old_data.txt";
std::string new_path = "new_data.txt";
try {
// 不带错误码参数的版本,失败会抛出异常
std::filesystem::rename(old_path, new_path);
std::cout << "文件重命名成功" << std::endl;
} catch (const std::filesystem::filesystem_error& e) {
std::cout << "文件重命名失败,错误信息:" << e.what() << std::endl;
}
// 带错误码参数的版本,失败不会抛出异常
std::error_code ec;
std::filesystem::rename("test.txt", "test_new.txt", ec);
if (ec) {
std::cout << "重命名失败,错误码:" << ec.message() << std::endl;
} else {
std::cout << "重命名成功" << std::endl;
}
return 0;
}
注意事项
- 使用该库需要编译器支持C++17及以上标准,编译时需要添加对应的编译选项,比如GCC需要添加
-std=c++17参数 - 相比C标准库的
rename函数,该接口会自动处理路径中的分隔符,跨平台兼容性更好 - 如果新文件已经存在,默认会抛出异常,也可以通过额外参数指定覆盖行为
两种方法对比
| 对比项 | C标准库rename | std::filesystem::rename |
|---|---|---|
| 兼容性 | 支持所有C++版本,跨平台性好 | 仅支持C++17及以上版本 |
| 错误处理 | 通过返回值和errno判断 | 支持异常和错误码两种处理方式 |
| 路径处理 | 需要手动处理路径分隔符 | 自动适配不同系统的路径分隔符 |
| 功能扩展性 | 仅支持重命名基础功能 | 可以配合filesystem库其他接口完成更多文件操作 |
开发者可以根据项目的编译器版本和需求选择合适的实现方式,如果是较新的项目,推荐使用std::filesystem库,接口更友好,扩展性更强。
C++rename_filestd_filesystem修改时间:2026-07-05 21:21:13