Hàm rename() trong thư viện C (<cstdio>) dùng để đổi tên hoặc di chuyển file.
Cú pháp
int rename(const char* old_filename, const char* new_filename);
Tham số & Giá trị trả về
old_filename: Tên file hiện tạinew_filename: Tên file mới (có thể bao gồm đường dẫn khác → di chuyển file)- Trả về
0: Thành công - Trả về
-1: Thất bại (seterrno)
Ví dụ: Đổi tên file
#include <cstdio>
int main() {
const char* oldname = "file.txt";
const char* newname = "newfile.txt";
int ret = rename(oldname, newname);
if (ret == 0) {
printf("File da duoc doi ten thanh cong\n");
} else {
perror("Loi doi ten file");
}
return 0;
}
Kết quả
File da duoc doi ten thanh cong
Di chuyển file (cùng phân vùng/ổ đĩa)
// Di chuyển file.txt từ thư mục hiện tại sang /tmp/
rename("file.txt", "/tmp/file.txt");
Lưu ý quan trọng
- Nếu
new_filenameđã tồn tại: Hành vi phụ thuộc OS (thường ghi đè trên POSIX, thất bại trên Windows) - Không thể rename跨 filesystem (khác ổ đĩa/phân vùng) trên một số hệ thống
- File không được mở bởi tiến trình nào
- Cần quyền ghi trên cả thư mục nguồn và đích
Xử lý lỗi chi tiết
#include <cerrno>
#include <cstring>
int ret = rename("old.txt", "new.txt");
if (ret != 0) {
switch (errno) {
case ENOENT: printf("File goc khong ton tai\n"); break;
case EACCES: printf("Khong co quyen\n"); break;
case EEXIST: printf("File dich da ton tai (Windows)\n"); break;
case EXDEV: printf("Khac filesystem - khong the di chuyen\n"); break;
default: printf("Loi: %s\n", strerror(errno));
}
}
C++17: std::filesystem::rename (Khuyến nghị)
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path from = "file.txt";
fs::path to = "newfile.txt";
std::error_code ec;
fs::rename(from, to, ec);
if (!ec) {
std::cout << "Da doi ten: " << from << " -> " << to << std::endl;
} else {
std::cout << "Loi: " << ec.message() << std::endl;
}
}
Đặc biệt: std::filesystem::rename có thể ghi đè (C++17)
// C++17: fs::rename GHI ĐÈ file đích nếu tồn tại (trên POSIX)
// Windows: Cần fs::remove(to) trước hoặc dùng fs::rename với replace flag
fs::rename(from, to, ec); // Trên Linux: ghi đè tự động
So sánh
| Đặc điểm | C rename() | C++17 fs::rename |
|---|---|---|
| Cross-platform | Hành vi khác nhau | Chuẩn hóa |
| Ghi đè file đích | Phụ thuộc OS | Có kiểm soát |
| Đường dẫn | C-string | fs::path (type-safe) |
| Xử lý lỗi | errno | std::error_code |
Tóm tắt
rename(old, new)đổi tên hoặc di chuyển file- Trả về 0 nếu thành công
- C++17: Dùng
std::filesystem::renamean toàn, cross-platform hơn