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= ล้มเหลว (Seterrno)
ตัวอย่าง: เปลี่ยนชื่อไฟล์
#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 มากขึ้น