Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm rename() đổi tên file trong C/C++

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ại
  • new_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 (set errno)

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ểmC rename()C++17 fs::rename
Cross-platformHành vi khác nhauChuẩn hóa
Ghi đè file đíchPhụ thuộc OSCó kiểm soát
Đường dẫnC-stringfs::path (type-safe)
Xử lý lỗierrnostd::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::rename an toàn, cross-platform hơn