Làm thế nào để tạo thư mục đệ quy trong ruby?


101

Tôi muốn lưu trữ tệp dưới dạng /a/b/c/d.txt, nhưng tôi không biết liệu có bất kỳ thư mục nào trong số này tồn tại hay không và cần tạo đệ quy chúng nếu cần. Làm thế nào một người có thể làm điều này trong ruby?

Câu trả lời:


197

Sử dụng mkdir_p:

FileUtils.mkdir_p '/a/b/c'

_pmột lưu giữ unix cho cha / đường dẫn, bạn cũng có thể sử dụng bí danh mkpathnếu điều đó có ý nghĩa hơn đối với bạn.

FileUtils.mkpath '/a/b/c'

Trong Ruby 1.9 FileUtils đã bị xóa khỏi lõi, vì vậy bạn sẽ phải làm như vậy require 'fileutils'.


9
+1. FileUtilsPathnamecó lẽ những công cụ quan trọng nhất để tạo script Ruby shell.
Jörg W Mittag 10/09/10

21

Sử dụng mkdir_p để tạo thư mục một cách đệ quy

path = "/tmp/a/b/c"

FileUtils.mkdir_p(path) unless File.exists?(path)

5

Nếu bạn đang chạy trên các máy unixy, đừng quên rằng bạn luôn có thể chạy lệnh shell dưới ruby ​​bằng cách đặt nó vào các dấu gạch ngược.

`mkdir -p /a/b/c`

Tuy nhiên, tích cực là vậy.
Matthew Schinckel

1
Đưa lệnh hệ thống vào quy trình con không phải là ý tưởng tốt nhất. Tốt hơn là làm điều đó với thư viện chuẩn của Ruby để xử lý lỗi, kiểm tra kết quả, v.v.
noraj


2

Tên đường dẫn để giải cứu!

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

Điều này kém trực quan hơn câu trả lời được chấp nhận. Ngoài ra, tài liệu cho phương thức này được chuyển tiếp tới FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…
noraj

Câu hỏi là: "Tôi muốn lưu trữ một tệp dưới dạng /a/b/c/d.txt, nhưng tôi không biết liệu có bất kỳ thư mục nào trong số này tồn tại hay không". Giải pháp của tôi cho phép sử dụng đường dẫn tệp hiện có ('/a/b/c/d.txt') và, không cần phân tích cú pháp riêng, tạo tất cả các thư mục.
Vadym Tyemirov

Ý bạn là điều này cho phép thực hiện FileUtils.mkdir_p '/a/b/c'+ tạo d.txtcùng một lúc?
noraj

Nope, thay vào đó nó cho phép Pathname('/a/b/c/d.txt').dirname.mkpathFile.write('/a/b/c/d.txt', content)không có filename = '/a/b/c/d.txt'.rpartition('/').lastvà phần còn lại của phân tích cú pháp
Vadym Tyemirov

0

Bạn cũng có thể sử dụng logic của riêng mình

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

Vì vậy, nếu đường dẫn là 'tmp / a / b / c' nếu 'tmp' không tồn tại 'tmp' được tạo, thì 'tmp / a /', v.v.


Người ta sẽ tránh để phát minh lại bánh xe.
noraj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.