การเปลี่ยนชื่อไฟล์และย้ายไฟล์ใน Node.js
ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับการเปลี่ยนชื่อไฟล์และย้ายไฟล์ใน Node.js ซึ่งสามารถทำได้โดยการใช้ฟังก์ชันจากโมดูล fs ของ Node.js นี่เป็นเนื้อหาในบทนี้
- ฟังก์ชัน fs.rename()
- ฟังก์ชัน fs.renameSync()
- ฟังก์ชัน fsPromises.rename()
- การสร้างโฟล์เดอร์ปลายทาง
ฟังก์ชัน fs.rename()
การเปลี่ยนชื่อไฟล์และการย้ายไฟล์บน Node.js นั้นใช้ฟังก์ชันเดียวกันนั่นคือฟังก์ชัน fs.rename() ที่มีการทำงานเป็นแบบ Asynchronous นี่เป็นรูปแบบการใช้งาน
fs.rename(oldPath, newPath, callback);
- oldPath: พาธของไฟล์ต้นทางที่ต้องการเปลี่ยนชื่อหรือย้าย
- newPath: พาธของไฟล์ปลายทางที่ต้องการเปลี่ยนชื่อหรือย้าย
- callback: ฟังก์ชันที่จะถูกเรียกเมื่อการทำงานสำเร็จ
นี่เป็นตัวอย่างการเขียนโปรแกรมสำหรับเปลี่ยนชื่อไฟล์ใน Node.js ด้วยฟังก์ชัน fs.rename() โดยก่อนที่จะรันโปรแกรมเราจะต้องสร้างไฟล์ old_file.txt ขึ้นมาก่อน
const fs = require("fs");
fs.rename("old_file.txt", "new_file.txt", (err) => {
if (err) {
console.log(err);
} else {
console.log("The file was renamed successfully.");
}
});
นี่เป็นผลลัพธ์การทำงานของโปรแกรม
The file was renamed successfully.
ในตัวอย่างนี้ เป็นการเขียนโปรแกรมเพื่อเปลี่ยนชื่อไฟล์ old_file.txt ให้เป็น new_file.txt ซึ่งใน Noe.js นี่มีความหมายเท่ากับการย้ายไฟล์ เนื่องจากการเปลี่ยนชื่อหรือการย้ายไฟล์ก็คือการเปลี่ยนพาธของไฟล์ให้เป็นพาธใหม่นั่นเอง
เมื่อการทำงานเสร็จสิ้นฟังก์ชัน Callback จะถูกเรียกใช้งานโดยมีพารามิเตอร์ err
ซึ่งจะมีค่าเป็นออบเจ็ค Error หากมีข้อผิดพลาดหรือ null
หากไม่มีข้อผิดพลาดเกิดขึ้น และในการเปลี่ยนชื่อไฟล์หรือย้ายไฟล์นั้นไฟล์ต้นทางจะต้องมีอยู่จริงเสมอ
ในตัวอย่างก่อนหน้าการระบุพาธของไฟล์เป็นแบบอ้างอิงจากโฟล์เดอร์ปัจจุบัน (Relative) อย่างไรก็ตาม หากไฟล์ต้นทางและไฟล์ปลายทางอยู่คนละโฟล์เดอร์กับไฟล์ของโปรแกรม คุณสามารถระบุเป็นพาธแบบเต็ม (Absolute) ได้ นี่เป็นตัวอย่าง
const fs = require("fs");
let src = "C:\\projects\\my_file.txt";
let dst = "C:\\new_projects\\my_file.txt";
fs.rename(src, dst, (err) => {
if (err) {
console.log(err.message);
} else {
console.log("The file was moved to new_projects directory.");
}
});
นี่เป็นผลลัพธ์การทำงานของโปรแกรมเมื่อรันครั้งแรก
ENOENT: no such file or directory, rename 'C:\projects\my_file.txt' -> 'C:\new_projects\my_file.txt'
ในตัวอย่างนี้ เป็นการเขียนโปรแกรมเพื่อย้ายไฟล์ my_file.txt จากโฟล์เดอร์ projects ไปยังโฟล์เดอร์ new_projects โดยการระบุพาธของไฟล์เป็นพาธแบบเต็ม และในตัวอย่างนี้เรากำหนดให้การย้ายไฟล์ไม่สำเร็จเนื่องจากโฟล์เดอร์ปลายทางไม่มีอยู่
ในการเปลี่ยนชื่อหรือย้ายไฟล์บน Node.js นั้นโฟล์เดอร์ในพาธปลายทางจะต้องมีอยู่ก่อนจึงจะสามารถทำการย้ายไฟล์ได้ ดังนั้นเราต้องสร้างโฟล์เดอร์ new_projects ในไดร์ฟ C และรันโปรแกรมอีกครั้งจะได้ผลลัพธ์เป็นสำเร็จ
The file was moved to new_projects directory.
ฟังก์ชัน fs.renameSync()
ฟังก์ชันต่อมาสำหรับเปลี่ยนชื่อหรือย้ายไฟล์บน Node.js คือฟังก์ชัน fs.renameSync() ซึ่งเป็นฟังก์ชันที่ทำงานแบบ Synchronous นี่เป็นรูปแบบการใช้งาน
fs.renameSync(oldPath, newPath)
- oldPath: พาธของไฟล์ต้นทางที่ต้องการเปลี่ยนชื่อหรือย้าย
- newPath: พาธของไฟล์ต้นทางที่ต้องการเปลี่ยนชื่อหรือย้าย
ฟังก์ชันนี้ไม่ต้องการ Callback เนื่องจากมันจะบล็อกการทำงานของโปรแกรม และจะ throw ข้อผิดพลาดหากการเปลี่ยนชื่อไฟล์หรือการย้ายไฟล์ไม่สำเร็จ นี่เป็นตัวอย่างการใช้งาน
const fs = require("fs");
try {
fs.renameSync("old_file.txt", "new_file.txt");
console.log("The file was renamed successfully.");
} catch (err) {
console.log(err.message);
}
นี่เป็นผลลัพธ์การทำงานของโปรแกรม
The file was renamed successfully.
ฟังก์ชัน fsPromises.rename()
ฟังก์ชันสำหรับเปลี่ยนชื่อไฟล์และย้ายไฟล์แบบสุดท้ายจะเป็นแบบ Promise โดยการเรียกใช้งานจะเหมือนกับฟังก์ชัน fs.renameSync() ยกเว้นแต่ว่ามันจะส่งค่ากลับเป็น Promise นี่เป็นรูปแบบการใช้งาน
fsPromises.rename(oldPath, newPath);
- oldPath: พาธของไฟล์ต้นทางที่ต้องการเปลี่ยนชื่อหรือย้าย
- newPath: พาธของไฟล์ต้นทางที่ต้องการเปลี่ยนชื่อหรือย้าย
ฟังก์ชันนี้ส่งค่ากลับเป็น Promise เมื่อมันทำงานเสร็จ ดังนั้นเราสามารถใช้เป็น Promise หรือจะใช้ร่วมกับคำสั่ง async/await ก็ได้ นี่เป็นตัวอย่างของการใช้งานในทั้งสองรูปแบบ
const fsPromises = require("fs/promises");
fsPromises.rename("old_file.txt", "new_file.txt").then(() => {
console.log("The file was renamed successfully.");
}).catch((err) => {
console.log(err.message);
});
นี่เป็นการใช้งานร่วมกับคำสั่ง async/await เพื่อให้การทำงานเป็นแบบ Synchronous
const fsPromises = require("fs/promises");
(async () => {
try {
await fsPromises.rename("old_file.txt", "new_file.txt");
console.log("The file was renamed successfully.");
} catch (err) {
console.log(err.message);
}
})();
ซึ่งการเขียนในทั้งสองรูปแบบให้ผลลัพธ์เหมือนกัน และนี่เป็นผลลัพธ์ของโปรแกรม
The file was renamed successfully.
การสร้างโฟล์เดอร์ปลายทาง
โดยปกติแล้วในการใช้ฟังก์ชันเพื่อเปลี่ยนชื่อไฟล์หรือย้ายไฟล์ โฟล์เดอร์ปลายทางจะต้องถูกสร้างไว้หรือมีก่อนอยู่แล้ว อย่างไรก็ตาม การทำเช่นนั้นอาจไม่สะดวกเมื่อต้องทำแบบนี้เป็นจำนวนมาก ซึ่งเราสามารถแก้ปัญหานี้ได้โดยเขียนโปรแกรมเพื่อสร้างโฟล์เดอร์ขึ้นมาก่อน
ต่อไปมาเขียนโปรแกรมเปลี่ยนชื่อไฟล์หรือย้ายไฟล์ที่สามารถสร้างโฟล์เดอร์ปลายทางอัตโนมัติได้หากมันยังไม่มีอยู่
const fs = require("fs");
let srcDir = "C:\\old_project\\";
let dstDir = "C:\\new_project\\";
try {
try {
// Check if a directory exists
fs.accessSync(dstDir, fs.constants.F_OK);
} catch (err) {
console.log(err.message);
// Create a directory
fs.mkdirSync(dstDir, { recursive: true });
console.log("The destination directory was created.");
}
fs.renameSync(srcDir + "my_file.txt", dstDir + "my_file.txt");
console.log("The file was moved successfully.");
} catch (err) {
console.log(err.message);
}
นี่เป็นผลลัพธ์การทำงานของโปรแกรม
ENOENT: no such file or directory, access 'C:\new_project'
The destination directory was created.
The file was moved successfully.
ในตัวอย่างนี้เป็นการเขียนโปรแกรมเพื่อย้ายไฟล์จากโฟล์เดอร์ old_project ไปยัง new_project แต่ก่อนจะทำการย้ายไฟล์นั้นเราได้ตรวจสอบก่อนว่าโฟล์เดอร์ปลายทางมีอยู่หรือไม่ด้วยฟังก์ชัน fs.accessSync() ซึ่งนี่จะ throw ข้อผิดพลาดขึ้นหากมันไม่มีอยู่
ในกรณนีที่ยังไม่มีโฟล์เดอร์ปลายทางเราสร้างโฟล์เดอร์ด้วยฟังก์ชัน fs.mkdirSync() โดยการระบุตัวเลือกในการสร้าง recursive
เป็น true
สำหรับกรณีที่พาธเป็นโฟล์เดอร์ที่ซ้อนกันแบบหลายชั้น
ในบทนี้ คุณได้เรียนรู้การเขียนโปรแกรมเพื่อเปลี่ยนชื่อไฟล์และย้ายไฟล์บน Node.js การเปลี่ยนชื่อไฟล์และย้ายไฟล์ใน Node.js นั้นคือการดำเนินการเดียวกันใน Node.js และเราได้พูดถึงการสร้างโฟล์เดอร์ปลายทางอัติโนมัติหากมันไม่มีอยู่