การเปลี่ยนชื่อไฟล์และย้ายไฟล์ใน Node.js

9 December 2023

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับการเปลี่ยนชื่อไฟล์และย้ายไฟล์ใน 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 ขึ้นมาก่อน

rename_file.js
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) ได้ นี่เป็นตัวอย่าง

rename_file2.js
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 ข้อผิดพลาดหากการเปลี่ยนชื่อไฟล์หรือการย้ายไฟล์ไม่สำเร็จ นี่เป็นตัวอย่างการใช้งาน

rename_file_sync.js
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 ก็ได้ นี่เป็นตัวอย่างของการใช้งานในทั้งสองรูปแบบ

rename_promise.js
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

rename_async_await.js
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.

การสร้างโฟล์เดอร์ปลายทาง

โดยปกติแล้วในการใช้ฟังก์ชันเพื่อเปลี่ยนชื่อไฟล์หรือย้ายไฟล์ โฟล์เดอร์ปลายทางจะต้องถูกสร้างไว้หรือมีก่อนอยู่แล้ว อย่างไรก็ตาม การทำเช่นนั้นอาจไม่สะดวกเมื่อต้องทำแบบนี้เป็นจำนวนมาก ซึ่งเราสามารถแก้ปัญหานี้ได้โดยเขียนโปรแกรมเพื่อสร้างโฟล์เดอร์ขึ้นมาก่อน

ต่อไปมาเขียนโปรแกรมเปลี่ยนชื่อไฟล์หรือย้ายไฟล์ที่สามารถสร้างโฟล์เดอร์ปลายทางอัตโนมัติได้หากมันยังไม่มีอยู่

create_directory.js
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 และเราได้พูดถึงการสร้างโฟล์เดอร์ปลายทางอัติโนมัติหากมันไม่มีอยู่

บทความนี้เป็นประโยชน์หรือไม่?Yes·No