NodeJS ตอนที่ 10 [การทำงานเกี่ยวกับไฟล์]

NodeJS ตอนที่ 10 [การทำงานเกี่ยวกับไฟล์]

nodejs-green

ในการเขียนโปรแกรมสิ่งที่เราเกี่ยวข้องด้วยมากทีสุดอย่างหนึ่งก็คือการเขียนโปรแกรมร่วมกับไฟล์ ไม่ว่าจะเป็นไฟล์ Text เอกสาร รูปภาพ ไฟล์เสียง มัลติมีเดีย ล้วนเป็นส่วนประกอบในแอพพลิเคชั่นของเรา สำหรับ nodejs ไลบรารี่ที่ใช้จัดการเกี่ยวกับไฟล์อยู่ในไลบรารี่ที่ชื่อ fs ย่อมาจาก File System

ตัวอย่างการเขียนโค้ด สร้าง Text ไฟล์

  1. สร้างไฟล์ชื่อ ch10_fs.js
  2. ป้อนโค้ด ดังนี้
var fs = require('fs');
fs.writeFile('message.txt', 'Hello Node.js', (err) => {
  if (err) throw err;
  console.log('It's saved!');
});

3. ทดสอบ

node ch10_fs.js

อธิบายโค้ด

var fs = require('fs');

เรียกใช้ไลบรารี่ fs

fs.writeFile('message.txt', 'Hello Node.js', (err) =>{}

fs.writeFile (fileName,content ,callback) สร้างไฟล์

  • พารามิเตอร์แรก 'message.txt' คือชื่อไฟล์ที่ต้องการสร้าง ถ้ามีไฟล์นี้อยู่แล้วจะถูกเขียนทับ
  • พารามิเตอร์ตัวที่สอง '' คือข้อความที่ต้องการเขียนลงในไฟล์
  • พารามิเตอร์ตัวที่สาม (err) => คืนค่าเมื่อมีข้อผิดพลาดเกิดขึ้น

ตัวอย่างการเขียนโค้ดเพิ่มข้อมลูลลง Text ไฟล์

จากโค้ดตัวอย่างก่อนหน้านี่ เพิ่มโค้ด ดังนี้

fs.appendFile('message.txt','Hi Are you ready? ',(err)=>{
  if(err) throw err;
  console.log('It's appended!');
});

ลองทดสอบ

node ch10_fs.js

ผลลัพธ์

It's appended!
It's saved!

เนื้อหาในไฟล์

Hello Node.js 1y?

ลำดับการทำงาน appendFile ทำก่อน writeFile เพราะเขียนเป็น asynchronous ทำให้ได้ผลลัพธ์ไม่เป็นลำดับต่อเนื่องกัน

ปรับเปลี่ยนโค้ดให้ทำงานตามลำดับ ดังนี้

fs.writeFile('message.txt', 'Hello Node.js', (err) => {
  if (err) throw err;
  console.log('It's saved!');
  fs.appendFile('message.txt','Hi Are you ready? ',(err)=>{
    if(err) throw err;
    console.log('It's appended!');
  });
});

ผลลัพธ์

It's saved!
It's appended!

เนื้อหาในไฟล์

Hello Node.js Hi Are you ready?

จำได้มั้ย การเขียนโค้ดแบบนี้มันคือ callback hell มาปรับโค้ดให้อ่านง่ายด้วย promise

var writeFile = new Promise(
        function(resolve, reject) {
          fs.writeFile('message.txt', 'Hello Node.js', (err) => {
          if (err) reject(err);
          resolve(true);
          console.log('It's saved!');
        })
      });

var appendFile = new Promise(
        function(resolve, reject) {
            fs.appendFile('message.txt', 'nHi Are you ready?', (err) => {
            if (err) reject(err);
            resolve(true);
            console.log('It's appended!');
        })
      });
  writeFile
  .then(appendFile);

เมื่อเขียนข้อมูลลงไปแล้วเรามาเขียนโค้ดอ่านไฟล์กันบ้าง

ตัวอย่างการเขียนโค้ดอ่านไฟล์

var fileName = 'message.txt';
var content = fs.readFileSync(fileName).toString();
console.log(content);

fs.readFileSysc จะทำการอ่านไฟล์แบบ synchronous อ่านไฟล์จนจบก่อนจึงทำงานคำสั่งถัดไป

หากเราต้องการแก้ไขข้อมูลบรรทัดที่ต้องการสามารถทำได้  ดังนี้

ตัวอย่างการเขียนโค้ดแก้ไขข้อมูลบรรทัดที่ต้องการอย่างง่ายๆ

เพิ่มโค้ดต่อจากเมื่อสักครู่

var contents = content.split('n');
contents[1] = 'Edit Data this line';
contents[2] = 'Add new data';
fs.writeFile(fileName,contents.join('n'),function(err){
  content =  fs.readFileSync(fileName).toString();
  console.log('New Data!');
  console.log(content);
});

อธิบายโค้ด

var contents = content.split('n');

ทำการตัด ข้อความเป็นเก็บไว้ในอาร์เรย์ ด้วยการตัดบรรทัด n คือแต่ละบรรทัด

contents[1] = 'Edit Data this line';

แก้ไขบรรทัดที่ 2 ซึ่งอยู่ในตำแหน่งอาร์เรย์ที่ 1 ด้วยคำว่า Edit Data this line  (ตำแหน่งอาร์เรย์เริ่มที่ 0 พื้นฐานที่รู้กันอยู่แล้ว)

contents[2] = 'Add new data';

JavaScript เป็นภาษาที่มีความ dynamic อาร์เรย์ตำแหน่งที่ 2 ยังไม่มีค่าเลยก็สามารถประกาศและป้อนค่าไปได้เลย หลายๆภาษาจะไม่ยอมไห้ทำเช่นนี้ ซึ่งวิธีการแบบนี้ก็มีทั้งข้อดีและเสีย

contents.join('n')

ทำการแปลงอาร์เรย์เป็นข้อความ โดยให้เชื่อมต่อกันด้วย n เป็นตัวแยกบรรทัดของแต่ละอาร์เรย์

ตัวอย่างการลบไฟล์

var fileName = 'message.txt';
fs.unlinkSync(fileName);
fs.exists(fileName,function(exists){
  console.log(exists);
});

อธิบายโค้ด

fs.unlinkSync(fileName);

NodeJS จะใช้คำไม่เหมือนภาษาอื่น ส่วนใหญ่ก็ใช้คำว่า delete หรือ remove แต่สำหรับ Node ใช้คำว่า unlink

fs.exists(fileName,function(exists){
  console.log(exists);
});

เมื่อทำการลบไฟล์ก็ทำการตรวจสอยให้แน่ใจว่ามีไฟล์อยู่หรือไม่

พบกับตอนที่ 10.2 การจัดการเกี่ยวกับไฟล์ต่อ


1 Comment

  1. Natthaphon

    สงสัยเรื่อง Promise

    จากตัวอย่างทำไม appendFile ทำงานก่อน

Leave a comment!

You must be logged in to post a comment.