ในโหนด โมดูล fs อ้างถึง "โมดูลระบบไฟล์" ซึ่งเป็นโมดูลที่ใช้เพื่อดำเนินการกับไฟล์ API ส่วนใหญ่ของโมดูล fs มีวิธีการทำงานสามวิธี: 1. การทำงานของไฟล์แบบซิงโครนัส: โค้ดจะถูกบล็อกและจะไม่ดำเนินการต่อไป 2. ไฟล์การดำเนินการฟังก์ชันการเรียกกลับแบบอะซิงโครนัส: โค้ดจะไม่ถูกบล็อกและจำเป็นต้องมีฟังก์ชันการเรียกกลับ ส่งผ่านเมื่อสร้างผลลัพธ์แล้ว ฟังก์ชันการโทรกลับจะถูกดำเนินการ 3. ไฟล์การดำเนินการสัญญาแบบอะซิงโครนัส: รหัสจะไม่ถูกบล็อก และสัญญาจะถูกส่งกลับโดยการเรียกการดำเนินการของเมธอดผ่าน fs.promises
สภาพแวดล้อมการทำงานของบทช่วยสอนนี้: ระบบ Windows 7, nodejs เวอร์ชัน 16, คอมพิวเตอร์ DELL G3
โมดูลระบบไฟล์ (เรียกสั้น ๆ ว่า fs) ช่วยให้เราสามารถเข้าถึงและโต้ตอบกับระบบไฟล์บนคอมพิวเตอร์ของเรา
โมดูล fs เป็นโมดูลที่ Node.js จัดทำอย่างเป็นทางการสำหรับไฟล์ปฏิบัติการ โดยจัดเตรียมวิธีการและคุณสมบัติต่างๆ มากมายเพื่อตอบสนองความต้องการในการดำเนินการไฟล์ของผู้ใช้
วิธีการ fs.readFile() ใช้ในการอ่านเนื้อหาของไฟล์ที่ระบุ
เมธอด fs.writeFile() ใช้สำหรับเขียนเนื้อหาลงในไฟล์ที่ระบุหากคุณต้องการใช้ในโค้ด JavaScript
โมดูลระบบไฟล์เป็นโมดูล Node.js หลัก ซึ่งหมายความว่าเราไม่จำเป็นต้องติดตั้งมัน สิ่งเดียวที่เราต้องทำคือนำเข้าโมดูล fs ลงในไฟล์ของตัวเอง
ที่ด้านบนของไฟล์ให้เพิ่ม:
const fs = ต้องการ ('fs')ตอนนี้เราสามารถเรียกวิธีการใดก็ได้จากโมดูลระบบไฟล์โดยใช้คำนำหน้า fs
หรืออีกทางหนึ่ง เราสามารถนำเข้าวิธีการที่จำเป็นจาก fs API ได้ดังนี้:
const { writeFile, readFile } = ต้องการ ('fs')หมายเหตุ: เพื่อความสะดวก เราจำเป็นต้องนำเข้าโมดูลเส้นทางด้วย เป็นอีกหนึ่งโมดูลหลักของ Node.js ที่ช่วยให้เราสามารถทำงานกับไฟล์และเส้นทางไดเร็กทอรีได้
หลังจากนำเข้าโมดูล fs แล้ว ให้เพิ่ม:
เส้นทาง const = ต้องการ ('เส้นทาง')เมื่อใช้โมดูลระบบไฟล์ ไม่จำเป็นต้องใช้โมดูลพาธ แต่มันช่วยเราได้มาก!
โดยทั่วไปการทำงานของไฟล์ของโมดูล fs จะรองรับ API สองตัว: แบบซิงโครนัสและแบบอะซิงโครนัสรวมถึงฟังก์ชันการโทรกลับและแบบฟอร์ม Promsie การซิงโครไนซ์มักตามด้วยคำว่า sync
API ส่วนใหญ่ของโมดูล fs มีวิธีการทำงานสามวิธี:
การดำเนินการแบบซิงโครนัสของไฟล์: รหัสจะถูกบล็อกและจะไม่ดำเนินการต่อไป
ไฟล์การดำเนินการฟังก์ชันการเรียกกลับแบบอะซิงโครนัส: รหัสจะไม่ถูกบล็อก จำเป็นต้องส่งฟังก์ชันการเรียกกลับ และเมื่อได้รับผลลัพธ์ ฟังก์ชันการเรียกกลับจะถูกดำเนินการ
ไฟล์การดำเนินการสัญญาแบบอะซิงโครนัส: รหัสจะไม่ถูกบล็อก การดำเนินการวิธีการเรียกผ่าน fs.promises จะส่งคืนสัญญาซึ่งสามารถประมวลผลผ่านตอนนั้นและตรวจจับได้
โปรดทราบว่าวิธีการ fs ทั้งหมดเป็นแบบอะซิงโครนัสตามค่าเริ่มต้น อย่างไรก็ตาม เราสามารถใช้เวอร์ชันที่ซิงโครไนซ์ได้โดยการเพิ่ม Sync ที่ส่วนท้ายของวิธีการ
ตัวอย่างเช่น เวอร์ชันซิงโครนัสของเมธอด writeFile คือ writeFileSync วิธีการแบบซิงโครนัสทำให้โค้ดสมบูรณ์พร้อมกัน ดังนั้นจึงบล็อกเธรดหลัก การบล็อกเธรดหลักใน Node.js ถือเป็นการปฏิบัติที่ไม่ดี และเราไม่ควรทำเช่นนั้น
ดังนั้นด้านล่างเราจะใช้วิธีการอะซิงโครนัสในโมดูลระบบไฟล์
หากต้องการเขียนไฟล์จากแอปพลิเคชัน Node.js ให้ใช้เมธอด writeFile
เมธอด writeFile ยอมรับพารามิเตอร์ต่อไปนี้เป็นอย่างน้อย:
การเรียกกลับเนื้อหาชื่อไฟล์หากมีไฟล์ที่ระบุอยู่แล้ว ไฟล์นั้นจะแทนที่เนื้อหาเก่าด้วยเนื้อหาที่คุณระบุเป็นอาร์กิวเมนต์ หากไม่มีไฟล์ที่ระบุ ไฟล์ใหม่จะถูกสร้างขึ้น
หลังจากนำเข้าโมดูล fs และ path แล้ว ให้เขียนโค้ดต่อไปนี้ในไฟล์:
fs.writeFile('content.txt', 'การทำงานทั้งหมดและการไม่เล่นทำให้ Jack เป็นเด็กน่าเบื่อ!', err => { if (err) Throw err process.stdout.write('สร้างสำเร็จแล้ว!')})โค้ดด้านบนจะสร้างไฟล์ใหม่ชื่อ content.txt และเพิ่มข้อความ All work and no play makes Jack a Dud boy! หากมีข้อผิดพลาดใด ๆ ฟังก์ชันการเรียกกลับจะส่งข้อผิดพลาดนั้น มิฉะนั้น ไฟล์จะส่งออกไปยังคอนโซลว่าสร้างไฟล์สำเร็จแล้ว
writeFile มีรูปแบบอื่นๆ เช่น:
fs.writeFileSync — เขียนไฟล์พร้อมกัน fsPromises.writeFile — เขียนไฟล์โดยใช้ Promise-based APIตรวจสอบส่วนสำคัญนี้: https://gist.github.com/catalinpit/571ba06c06214b5c8744036c6500af92
ก่อนที่จะอ่านไฟล์ จำเป็นต้องสร้างและจัดเก็บพาธไปยังไฟล์ เส้นทางของโมดูลเส้นทางสะดวกที่นี่
เมื่อใช้วิธีการพาธจากโมดูลการรวม คุณสามารถสร้างพาธของไฟล์ได้ดังนี้:
const filePath = path.join(process.cwd(), 'content.txt')พารามิเตอร์แรก process.cwd() ส่งคืนไดเร็กทอรีการทำงานปัจจุบัน เมื่อคุณมีเส้นทางของไฟล์แล้ว คุณสามารถอ่านเนื้อหาของไฟล์ได้
เขียนรหัสต่อไปนี้ในไฟล์:
fs.readFile (filePath, (ข้อผิดพลาด, เนื้อหา) => { ถ้า (ข้อผิดพลาด) โยนข้อผิดพลาด process.stdout.write (เนื้อหา)})เมธอด readFile ยอมรับพารามิเตอร์อย่างน้อยสองตัว:
การเรียกกลับเส้นทางไฟล์หากมีข้อผิดพลาดก็จะเกิดข้อผิดพลาด มิฉะนั้นจะพิมพ์เนื้อหาไฟล์ในเทอร์มินัล
readFile มีรูปแบบอื่นๆ เช่น:
fs.readFileSync — เขียนลงไฟล์พร้อมกัน fsPromises.readFile — เขียนลงไฟล์โดยใช้ Promise-based APIตรวจสอบส่วนสำคัญนี้: https://gist.github.com/catalinpit/badc2a539a44412892a0e05a9575d54d
การแสดงไฟล์ในไดเร็กทอรีคล้ายกับการอ่านเนื้อหาไฟล์มาก อย่างไรก็ตาม แทนที่จะส่งเส้นทางของไฟล์ ให้ส่งผ่านไดเร็กทอรีการทำงานปัจจุบัน (เราสามารถส่งผ่านไดเร็กทอรีอื่นก็ได้)
จากนั้นส่งฟังก์ชันโทรกลับเพื่อจัดการกับการตอบสนอง เขียนรหัสต่อไปนี้ในไฟล์:
fs.readdir(process.cwd(), (ข้อผิดพลาด, ไฟล์) => { ถ้า (ข้อผิดพลาด) โยนข้อผิดพลาด console.log (ไฟล์)})จนถึงตอนนี้ เราใช้เพียง process.stdout.write เพื่อส่งออกเนื้อหาไปยังเทอร์มินัล อย่างไรก็ตาม คุณสามารถใช้ console.log ได้ เช่นเดียวกับในข้อมูลโค้ดด้านบน
หากเรารันแอปพลิเคชัน เราควรจะได้อาร์เรย์ที่มีไฟล์ทั้งหมดในไดเร็กทอรี
ตรวจสอบส่วนสำคัญนี้: https://gist.github.com/catalinpit/f82c4e6ae3acd5d97efdecb0bc67979e
โมดูลระบบไฟล์มีวิธีการที่ช่วยให้คุณสามารถลบไฟล์ได้ อย่างไรก็ตาม สิ่งสำคัญที่ควรทราบก็คือ ใช้งานได้กับไฟล์เท่านั้น ไม่ใช่ไดเร็กทอรี
เมื่อเมธอด unlink ถูกเรียกใช้โดยมีพาธของไฟล์เป็นพารามิเตอร์ มันจะลบไฟล์ เพิ่มข้อมูลโค้ดต่อไปนี้ลงในไฟล์:
fs.unlink(filePath, error => { if (error) Throw error console.log('ไฟล์ถูกลบแล้ว!')})หากคุณรันโค้ดอีกครั้ง ไฟล์ของคุณจะถูกลบ!
ตรวจสอบส่วนสำคัญนี้: https://gist.github.com/catalinpit/b1201434218c400f77e042109bfce99e
เราสามารถสร้างไดเร็กทอรีแบบอะซิงโครนัสโดยใช้วิธี mkdir เขียนรหัสต่อไปนี้ในไฟล์:
fs.mkdir(`${process.cwd()}/myFolder/secondFolder`, { recursive: true }, (err) => { if (err) Throw err console.log('สร้างโฟลเดอร์สำเร็จแล้ว!') })ขั้นแรก สร้างโฟลเดอร์ใหม่ในไดเร็กทอรีการทำงานปัจจุบัน ตามที่กล่าวไว้ก่อนหน้านี้ คุณสามารถรับไดเร็กทอรีการทำงานปัจจุบันจากอ็อบเจ็กต์กระบวนการได้โดยใช้เมธอด cwd()
จากนั้นส่งโฟลเดอร์หรือโฟลเดอร์ที่จะสร้าง อย่างไรก็ตาม นี่ไม่ได้หมายความว่าคุณต้องสร้างโฟลเดอร์ใหม่ในไดเร็กทอรีการทำงานปัจจุบันของคุณ คุณสามารถสร้างได้ทุกที่
ตอนนี้ พารามิเตอร์ตัวที่สองคือตัวเลือกแบบเรียกซ้ำ หากไม่ได้ตั้งค่าเป็น True จะไม่สามารถสร้างหลายโฟลเดอร์ได้ หากตั้งค่าตัวเลือกแบบเรียกซ้ำเป็นเท็จ โค้ดด้านบนจะทำให้เกิดข้อผิดพลาด ลองดูสิ!
อย่างไรก็ตาม หากคุณต้องการสร้างโฟลเดอร์เท่านั้น ไม่จำเป็นต้องตั้งค่าตัวเลือกการเรียกซ้ำเป็นจริง
รหัสต่อไปนี้ใช้งานได้ดี!
fs.mkdir(`${process.cwd()}/myFolder`, err => { if (err) Throw err console.log('สร้างโฟลเดอร์สำเร็จแล้ว!')});ดังนั้นผมจึงอยากจะเน้นการใช้แบบเรียกซ้ำ คุณต้องตั้งค่านี้เป็นจริงหากคุณต้องการสร้างโฟลเดอร์ภายในโฟลเดอร์ มันจะสร้างโฟลเดอร์ทั้งหมดแม้ว่าจะไม่มีอยู่ก็ตาม
ในทางกลับกัน หากคุณต้องการสร้างโฟลเดอร์เพียงอย่างเดียว คุณสามารถปล่อยให้เป็นเท็จได้
ตรวจสอบส่วนสำคัญนี้: https://gist.github.com/catalinpit/09bad802541102c0cce2a2e4c3985066
ตรรกะในการลบไดเร็กทอรีจะคล้ายกับการสร้างไดเร็กทอรี หากคุณดูโค้ดที่เขียนเพื่อสร้างไดเร็กทอรีและโค้ดด้านล่าง คุณจะเห็นความคล้ายคลึงกัน
ดังนั้นให้เขียนโค้ดต่อไปนี้ลงในไฟล์:
fs.rmdir(`${process.cwd()}/myFolder/`, { recursive: true }, err => { if (err) Throw err console.log('โฟลเดอร์ถูกลบเรียบร้อยแล้ว!')})ใช้เมธอด rmdir จากโมดูลระบบไฟล์และส่งพารามิเตอร์ต่อไปนี้:
ไดเร็กทอรีที่จะถูกลบการเรียกกลับคุณสมบัติแบบเรียกซ้ำหากคุณสมบัติแบบเรียกซ้ำถูกตั้งค่าเป็นจริง มันจะลบโฟลเดอร์และเนื้อหาในนั้น โปรดทราบว่าคุณต้องตั้งค่านี้ให้เป็นจริงหากโฟลเดอร์มีเนื้อหา มิฉะนั้นคุณจะได้รับข้อผิดพลาด
ข้อมูลโค้ดต่อไปนี้ใช้งานได้เฉพาะเมื่อโฟลเดอร์ว่างเปล่า:
fs.rmdir(`${process.cwd()}/myFolder/`, err => { ถ้า (ผิดพลาด) โยนข้อผิดพลาด console.log('ลบโฟลเดอร์เรียบร้อยแล้ว!')})หากมีไฟล์และ/หรือโฟลเดอร์อื่นใน myFolder ข้อผิดพลาดจะเกิดขึ้นหากไม่ผ่าน { recursive: true }
สิ่งสำคัญคือต้องรู้ว่าเมื่อใดควรใช้ตัวเลือกแบบเรียกซ้ำ และเมื่อใดไม่ควรหลีกเลี่ยงปัญหา
ตรวจสอบส่วนสำคัญนี้: https://gist.github.com/catalinpit/a8cb6aca75cef8d6ac5043eae9ba22ce
เมื่อใช้โมดูล fs คุณสามารถเปลี่ยนชื่อไดเร็กทอรีและไฟล์ได้ ข้อมูลโค้ดต่อไปนี้แสดงวิธีการทำเช่นนี้โดยใช้วิธีการเปลี่ยนชื่อ
// เปลี่ยนชื่อไดเร็กทอรี fs.rename(`${process.cwd()}/myFolder/secondFolder`, `${process.cwd()}/myFolder/newFolder`, err => { if (err) โยนคอนโซลข้อผิดพลาด .log('Directory rename!')});//เปลี่ยนชื่อไฟล์ fs.rename(`${process.cwd()}/content.txt`, `${process.cwd()}/newFile .txt` , err => { ถ้า (ผิดพลาด) โยนข้อผิดพลาด console.log('เปลี่ยนชื่อไฟล์!')});วิธีการเปลี่ยนชื่อประกอบด้วยพารามิเตอร์สามตัว:
พารามิเตอร์แรกคือโฟลเดอร์/ไฟล์ที่มีอยู่ และพารามิเตอร์ตัวที่สองคือการเรียกกลับชื่อใหม่ดังนั้น ในการเปลี่ยนชื่อไฟล์หรือไดเร็กทอรี เราจำเป็นต้องส่งชื่อของไฟล์/ไดเร็กทอรีปัจจุบันและชื่อใหม่ หลังจากรันแอพพลิเคชั่นแล้ว ควรอัพเดตชื่อของไดเร็กทอรี/ไฟล์
โปรดทราบว่าหากมีเส้นทางใหม่อยู่แล้ว (เช่น ชื่อใหม่สำหรับไฟล์/โฟลเดอร์) เส้นทางนั้นจะถูกเขียนทับ ดังนั้นอย่าลืมเขียนทับไฟล์/โฟลเดอร์ที่มีอยู่โดยไม่ได้ตั้งใจ
ตรวจสอบส่วนสำคัญนี้: https://gist.github.com/catalinpit/5c3e7c6ae39d09996ff67175a719122e
นอกจากนี้เรายังสามารถเพิ่มเนื้อหาใหม่ลงในไฟล์ที่มีอยู่โดยใช้วิธี appendFile
หากเราเปรียบเทียบทั้งสองวิธี writeFile และ appendFile เราจะเห็นว่าทั้งสองวิธีคล้ายกัน ส่งผ่านเส้นทางของไฟล์ เนื้อหา และการติดต่อกลับ
fs.appendFile(filePath, 'nการทำงานทั้งหมดและการไม่เล่นทำให้ Jack เป็นเด็กน่าเบื่อ!', err => { if (err) โยน err console.log('การทำงานทั้งหมดและการไม่เล่นทำให้ Jack เป็นเด็กน่าเบื่อ!')} )ข้อมูลโค้ดด้านบนสาธิตวิธีเพิ่มเนื้อหาใหม่ลงในไฟล์ที่มีอยู่ หากคุณเรียกใช้แอปพลิเคชันและเปิดไฟล์ คุณจะเห็นเนื้อหาใหม่ภายใน