จะสร้างไดเรกทอรีซ้ำในทับทิมได้อย่างไร?


101

ฉันต้องการจัดเก็บไฟล์เป็น /a/b/c/d.txt แต่ฉันไม่รู้ว่ามีไดเรกทอรีเหล่านี้อยู่หรือไม่และจำเป็นต้องสร้างซ้ำหากจำเป็น ทับทิมทำแบบนี้ได้อย่างไร?

คำตอบ:


197

ใช้mkdir_p:

FileUtils.mkdir_p '/a/b/c'

นี่_pคือยูนิกซ์โฮลด์สำหรับพาเรนต์ / พา ธ คุณยังสามารถใช้นามแฝงได้mkpathหากเหมาะสมกับคุณมากขึ้น

FileUtils.mkpath '/a/b/c'

ในทับทิม 1.9 FileUtils require 'fileutils'ถูกลบออกจากแกนดังนั้นคุณจะต้อง


9
+1. FileUtilsและPathnameอาจเป็นเครื่องมือที่สำคัญที่สุดสำหรับการเขียนสคริปต์เชลล์ Ruby
Jörg W Mittag


5

หากคุณใช้งานบนเครื่อง unixy อย่าลืมว่าคุณสามารถเรียกใช้คำสั่ง shell ภายใต้ Ruby ได้ตลอดเวลาโดยวางไว้ใน backticks

`mkdir -p /a/b/c`

แม้ว่าการเป็นคนคิดบวก
Matthew Schinckel

1
การใส่คำสั่งระบบลงในกระบวนการย่อยไม่ใช่ความคิดที่ดีที่สุด ควรใช้ไลบรารีมาตรฐาน Ruby เพื่อจัดการข้อผิดพลาดตรวจสอบผลลัพธ์ ฯลฯ
noraj


2

ชื่อเส้นทางสู่การช่วยเหลือ!

Pathname('/a/b/c/d.txt').dirname.mkpath

สิ่งนี้ใช้งานง่ายน้อยกว่าคำตอบที่ยอมรับ นอกจากนี้เอกสารสำหรับวิธีการส่งต่อไปยังFileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…
noraj

คำถามคือ "ฉันต้องการจัดเก็บไฟล์เป็น /a/b/c/d.txt แต่ฉันไม่รู้ว่ามีไดเรกทอรีเหล่านี้อยู่หรือไม่" โซลูชันของฉันอนุญาตให้ใช้เส้นทางไฟล์ที่มีอยู่ ('/a/b/c/d.txt') และสร้างโฟลเดอร์ทั้งหมดโดยไม่ต้องแยกวิเคราะห์
Vadym Tyemirov

คุณหมายถึงอนุญาตให้ทำFileUtils.mkdir_p '/a/b/c'+ สร้าง d.txtในเวลาเดียวกันหรือไม่?
noraj

ไม่ แต่จะอนุญาตPathname('/a/b/c/d.txt').dirname.mkpathและFile.write('/a/b/c/d.txt', content)ไม่มีfilename = '/a/b/c/d.txt'.rpartition('/').lastและส่วนที่เหลือของการแยกวิเคราะห์
Vadym Tyemirov

0

คุณยังสามารถใช้ตรรกะของคุณเอง

def self.create_dir_if_not_exists(path)
  recursive = path.split('/')
  directory = ''
  recursive.each do |sub_directory|
    directory += sub_directory + '/'
    Dir.mkdir(directory) unless (File.directory? directory)
  end
end

ดังนั้นหากเส้นทางคือ 'tmp / a / b / c' ถ้า 'tmp' ไม่มี 'tmp' จะถูกสร้างขึ้น 'tmp / a /' และอื่น ๆ ไปเรื่อย ๆ


หนึ่งจะหลีกเลี่ยงที่จะสร้างล้อใหม่
noraj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.