Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญการดำเนินการไดเรกทอรีใน Ruby: การแสดงรายการ นำทาง และสร้างโฟลเดอร์

คุณรู้ไหมว่าคุณสามารถนำทางระบบไฟล์ของคุณด้วย 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

ตอนถึงคุณนำไปปฏิบัติจริง

ขอบคุณที่อ่าน! 🙂