Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟังก์ชัน rename() ใน C/C++: เปลี่ยนชื่อไฟล์

std::rename (Header <cstdio> / <stdio.h>) ใช้สำหรับ เปลี่ยนชื่อไฟล์ หรือ ย้ายไฟล์ ระหว่าง Directory (บน Filesystem เดียวกัน)

ลายเซ็น

int rename(const char* old_filename, const char* new_filename);
  • old_filename: Path ปัจจุบัน
  • new_filename: Path ใหม่
  • คืน 0 = สำเร็จ, -1 = ล้มเหลว (Set errno)

ตัวอย่าง: เปลี่ยนชื่อไฟล์

#include <cstdio>
#include <iostream>

int main() {
    const char* oldname = "old_file.txt";
    const char* newname = "new_file.txt";
    
    // สร้างไฟล์เก่า
    FILE* fp = std::fopen(oldname, "w");
    if (fp) {
        std::fprintf(fp, "Original content\n");
        std::fclose(fp);
    }
    
    // เปลี่ยนชื่อ
    int ret = std::rename(oldname, newname);
    if (ret == 0) {
        std::cout << "File renamed successfully\n";
    } else {
        std::perror("Error renaming file");
    }
    return 0;
}

ผลลัพธ์


File renamed successfully

พฤติกรรมและข้อจำกัด

สถานการณ์พฤติกรรม
new_filename มีอยู่แล้วOverwrite (POSIX) / Fail (Windows, ถ้าไม่ได้ Flag)
Cross-device (Filesystem ต่างกัน)ล้มเหลว (EXDEV) - ต้อง Copy + Delete
Directoryได้ (ถ้า Empty บนบาง OS) แต่แนะนำ std::filesystem::rename
ไฟล์เปิดอยู่Windows: Fail, Linux: สำเร็จ (Inode คงอยู่)

Modern C++: std::filesystem::rename (C++17)

#include <filesystem>
#include <iostream>
#include <fstream>

namespace fs = std::filesystem;

int main() {
    fs::path from = "old_file.txt";
    fs::path to = "new_folder/new_file.txt"; // ย้ายพร้อมเปลี่ยนชื่อ
    
    // สร้างไฟล์และ Directory
    fs::create_directory("new_folder");
    std::ofstream(from) << "Content";
    
    try {
        fs::rename(from, to); // โยน Exception ถ้าล้มเหลว
        std::cout << "Renamed/Moved to: " << to << '\n';
    } catch (const fs::filesystem_error& e) {
        std::cerr << "Error: " << e.what() << '\n';
    }
}

สรุป

std::rename เปลี่ยนชื่อ/ย้ายไฟล์แบบ Atomic (บน POSIX) C++17 std::filesystem::rename ใช้งานง่ายกว่า (Path Object, Exception Safety) และ Cross-platform Consistent มากขึ้น