คุณรู้ไหมว่าคุณสามารถนำทางระบบไฟล์ของคุณด้วย Ruby ได้?
ด้วยคลาส Ruby "Dir"
คุณสามารถแสดงรายการไดเรกทอรี เปลี่ยนไดเรกทอรีปัจจุบัน และแม้แต่สร้างโฟลเดอร์ใหม่!
ตัวอย่าง:
filenames = Dir.entries(".")
เมธอด entries นี้ส่งคืนอาร์เรย์ของรายการชื่อไฟล์ ทุกรายการเป็นสตริง ดังนั้นคุณจะต้องรวมกับคลาส Ruby File หากคุณต้องการอ่านไฟล์เหล่านี้จริง
Btw, จุด (.) นี้แทน ไดเรกทอรีปัจจุบัน
นี่จะเป็นไดเรกทอรีที่โค้ดของคุณกำลังรันอยู่ ไม่ใช่ไดเรกทอรีที่คุณ (ในเทอร์มินัล) อยู่ขณะรันโค้ด
เพราะนั้น...
อาจช่วยได้ที่จะตรวจสอบไดเรกทอรีปัจจุบันของคุณโดยใช้เมธอด Dir.pwd
ตอนนี้:
มาเรียนรู้วิธีใช้คลาส Dir เพื่อสร้างไดเรกทอรีใหม่ (mkdir) เปลี่ยนชื่อ (mv) และหาชื่อไฟล์ที่ตรงตามรูปแบบเฉพาะ (glob)
การใช้เมธอด Mkdir ของ Ruby เพื่อสร้างไดเรกทอรีใหม่
หากคุณต้องการสร้างโฟลเดอร์ใหม่ด้วย Ruby คุณสามารถใช้เมธอด Dir.mkdir
ตัวอย่าง:
Dir.mkdir("testing")
หากให้พาธสัมพัทธ์ (relative path) ไดเรกทอรีนี้จะถูกสร้างภายใต้พาธปัจจุบัน (Dir.pwd)
คุณอาจได้ข้อผิดพลาดบ้าง:
- ไดเรกทอรีมีอยู่แล้ว (
Errno::EEXIST) - ปฏิเสธการเข้าถึง (
Errno::EACCES) - คุณกำลังพยายามสร้างโฟลเดอร์ภายใต้โฟลเดอร์อีกอันที่ยังไม่มีอยู่ (
Errno::ENOENT)
ข้อผิดพลาดสุดท้ายมักเกิดขึ้นเมื่อคุณพยายามสร้างไดเรกทอรีซ้อนกัน (nested directories)
หรือหากคุณใช้พาธสัมบูรณ์ที่ไม่มีอยู่
สองวิธีแก้:
- ตรวจสอบว่าไดเรกทอรีมีอยู่ก่อนสร้าง (ด้วย
Dir.exists?) - ใช้คลาสขั้นสูงกว่า (ส่วนถัดไป)
มาต่อไปกัน!
การดำเนินการขั้นสูงด้วยโมดูล FileUtils
หากคุณต้องการแรงม้าพิเศษเพิ่มเติม คุณสามารถนำเข้าโมดูล FileUtils จากไลบรารีมาตรฐาน
มันรวมเมธอดเช่น mkdir_p ที่สร้างไดเรกทอรีซ้อนได้ในขั้นตอนเดียว
ตัวอย่าง:
require 'fileutils'
FileUtils.mkdir_p("/tmp/testing/a/b")
น่าสนใจมาก สิ่งที่นี่?
นั่นไม่ใช่ทั้งหมด FileUtils ยังนำตัวเลือกเพิ่มเติมสำหรับการดำเนินการไฟล์ทั้งหมดในรูปแบบ keyword arguments มา เช่น ตัวเลือก verbose (พิมพ์คำสั่ง Linux) และ noop (อย่าเปลี่ยนไฟล์)
ลองทำดูสิ!
วิธีเปลี่ยนชื่อไดเรกทอรี
Ruby อนุญาตให้คุณทำทุกการดำเนินการที่คุณทำได้จากอินเทอร์เฟซผู้ใช้ระบบปฏิบัติการ หรือจากเทอร์มินัล
ตัวอย่าง...
คุณสามารถเปลี่ยนชื่อไดเรกทอรีแบบนี้:
FileUtils.mv("/tmp/a", "/tmp/b")
คุณจะต้องใช้ FileUtils ที่นี่เช่นกัน เพราะ mv ไม่พร้อมใช้งานบนคลาส Dir
วิธีเปลี่ยนไดเรกทอรีปัจจุบัน
เนื่องจากการดำเนินการไดเรกทอรีทั้งหมดรันจากไดเรกทอรีปัจจุบัน คุณอาจต้องการเปลี่ยนมัน
คุณสามารถใช้เมธอด Dir.chdir เพื่อทำสิ่งนี้
ตัวอย่าง:
Dir.chdir("/tmp") { Dir.entries(".") }
สิ่งนี้ทำงานสองแบบ:
- พร้อมบล็อก (block) ไดเรกทอรีปัจจุบันเปลี่ยนเฉพาะโค้ดภายในบล็อก
- ไม่มีบล็อก มันเปลี่ยนสำหรับโค้ดทั้งหมดหลังการเรียกเมธอด
สังเกตว่า chdir ทำงานได้เฉพาะภายในกระบวนการ Ruby ของคุณ มันไม่ส่งผลต่อ "โลกภายนอก"
กล่าวอีกนัยหนึ่ง...
มันจะไม่เปลี่ยนไดเรกทอรีทำงานของเชลล์ของคุณหลังจากโปรแกรม Ruby หยุดทำงาน
การแสดงรายการไฟล์และไดเรกทอรีด้วยการจับคู่รูปแบบ
อยากหาไฟล์ Ruby ทั้งหมดในโฟลเดอร์? ง่ายมากกับเมธอด glob!
ตัวอย่าง:
Dir.glob("*.rb")
คุณสามารถใช้นามสกุลอื่นๆ ได้ เช่น ".txt" หรือ ".yml" หรือข้อความอื่นๆ ที่เป็นส่วนหนึ่งของชื่อไฟล์
อยากหาไฟล์ภายในทุกโฟลเดอร์?
ได้ ไปได้:
Dir.glob("**/*.rb")
ผลลัพธ์คืออาร์เรย์พร้อมชื่อไฟล์ทั้งหมด รวมถึงพาธสัมพัทธ์ คุณสามารถลบพาธและได้แค่ชื่อไฟล์โดยใช้เมธอด File.basename บนทุกไฟล์ของรายการที่คุณได้จาก glob
สรุป
คุณได้เรียนรู้วิธีทำงานกับไดเรกทอรีใน Ruby โดยใช้คลาส Dir และ FileUtils
ตอนถึงคุณนำไปปฏิบัติจริง
ขอบคุณที่อ่าน! 🙂