রুবিতে ফাইল ক্লাস ব্যবহার না করে থাকলে ডিরেক্টরিটি কীভাবে তৈরি করব?


121

আমার এই বক্তব্য আছে:

File.open(some_path, 'w+') { |f| f.write(builder.to_html)  }

কোথায়

some_path = "somedir/some_subdir/some-file.html"

আমি কি ঘটতে করতে চান, যদি কোন ডিরেক্টরি বলা হয় somedirবা some_subdirবা পথ উভয়, আমি এটা স্বয়ংক্রিয়ভাবেই আপনার এটি তৈরি করতে চাই।

আমি এটা কিভাবে করবো?

উত্তর:


154

আপনি ফাইল ইউটিলেটগুলি পূর্বনির্ধারিত ডিরেক্টরিগুলি তৈরি করতে পুনরাবৃত্তভাবে ব্যবহার করতে পারেন, যদি সেগুলি ইতিমধ্যে উপস্থিত না থাকে:

require 'fileutils'

dirname = File.dirname(some_path)
unless File.directory?(dirname)
  FileUtils.mkdir_p(dirname)
end

সম্পাদনা করুন: এখানে কেবলমাত্র মূল লাইব্রেরি ব্যবহার করে একটি সমাধান দেওয়া হয়েছে (চাকাটির পুনর্নির্মাণ, প্রস্তাবিত নয়)

dirname = File.dirname(some_path)
tokens = dirname.split(/[\/\\]/) # don't forget the backslash for Windows! And to escape both "\" and "/"

1.upto(tokens.size) do |n|
  dir = tokens[0...n]
  Dir.mkdir(dir) unless Dir.exist?(dir)
end


ওহ ঠিক আছে. আমি মূল বোঝাতে চেয়েছি, স্টাডলিব নয়। যেভাবেই হোক না কেন, ঠিক আছে। এইটা কাজ করে. ধন্যবাদ!
মার্চামিলিয়ন

1
আমি আমার উত্তরের একটি কোর-একমাত্র সমাধান যুক্ত করেছি: তবে সচেতন থাকুন যে এটি প্রয়োজনীয়ভাবে পুনরুদ্ধার করে FileUtils.mkdir_p(যা আপনার ব্যবহারের ক্ষেত্রে উত্সর্গীকৃত পদ্ধতি)
ইউরেকা

57
মনে রাখবেন যে FileUtils#mkdir_pডিরেক্টরি শ্রেণিবদ্ধতা ইতিমধ্যে উপস্থিত থাকলেও এটি কাজ করে (এটি কেবল কিছুই করে না) সুতরাং এই FileUtils.mkdir_p(File.dirname(some_path))
ইউরেকা

1
@ জোসেফকে - আমার কাছে এটি (বিভ্রান্তিমূলক) এক্সেক্সিস্ট ত্রুটিটি অনুমতির সমস্যা হিসাবে শেষ হয়েছে।
টমজি

81

ডিরেক্টরি উপস্থিত না থাকলে ডিরেক্টরি তৈরি করার জন্য যারা সন্ধান করছেন তাদের জন্য , এখানে সহজ সমাধানটি দেওয়া হল:

require 'fileutils'

FileUtils.mkdir_p 'dir_name'

ইউরেকার মন্তব্যের ভিত্তিতে ।


1
এটি @ ইউরিকার মন্তব্য - "দ্রষ্টব্য যে ফাইল ইউটিলেস # এম কে ডি ডি_পি কাজ করেও যদি ডিরেক্টরি হায়ারার্কি ইতিমধ্যে উপস্থিত থাকে (এটি কেবল কিছুই করে না) সুতরাং এই সমাধানটি এক-লাইনারের সাথে সংমিশ্রণ করা যেতে পারে এবং একটি বিবৃতি প্রয়োজন: FileUtils.mkdir_p(File.dirname(some_path))"
দর্পণ

23
directory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)

2
আপনি এই পদ্ধতিটি ব্যবহার করে দৌড়ের অবস্থার মধ্যে দৌড়াতে পারেন, ফাইলটি.অস্তাদীদের পরে ডিরেক্টরিটি তৈরি হতে পারে? চালায় তবে Dir.mkdir কার্যকর হওয়ার আগে।
ম্যাট ফেনেলন

4

অন্যের উত্তরের ভিত্তিতে কিছুই ঘটেনি (কাজ হয়নি)। কোনও ত্রুটি ছিল না, এবং কোনও ডিরেক্টরি তৈরি করা হয়নি।

আমার যা করা দরকার তা এখানে:

require 'fileutils'
response = FileUtils.mkdir_p('dir_name')

আমাকে যে প্রতিক্রিয়াটি FileUtils.mkdir_p('dir_name')ফেরত পাঠায় তাকে ধরতে আমার একটি ভেরিয়েবল তৈরি করা দরকার ... তারপরে সবকিছু মনোহর মতো কাজ করেছিল!


কোন মানে নেই। তোমার রিটার্ন ধরতে হবে কেন?
টিম ক্রেটসকমার

@ হুয়ানসন, আমার রিটার্নটি ধরার দরকার ছিল না ... তবে আমি তৈরি না করা পর্যন্ত যুক্তি কার্যকর হয়নি response = FileUtils.mkdir_p('dir_name')। যদি আমি এই পরিবর্তনশীলটি তৈরি না করে থাকি তবে আমার FileUtils.mkdir_p('dir_name')পক্ষে কাজ করে না ... বা কমপক্ষে যা ঘটেছিল তা আমি স্মরণ করি (এই উত্তরটি 1 বছরেরও বেশি পুরানো)। রুবির একটি নতুন সংস্করণ যদি এই সমস্যাটি সমাধান করে তবে আমি অবাক হব না।
skplunkerin

2

কিভাবে ব্যবহার সম্পর্কে Pathname?

require 'pathname'
some_path = Pathname("somedir/some_subdir/some-file.html")
some_path.dirname.mkdir_p
some_path.write(builder.to_html)

1
এটি এর some_path.dirname.mkpathপরিবর্তেsome_path.dirname.mkdir_p
মুরো নিডোলা

1
+1 চালু mkpath। এছাড়াও যদি আপনার কেবল ডিরেক্টরী থাকে এবং পাথটি না থাকে, তবে প্রয়োজন নেই dirnameযেমন, প্যাথনাম ("সামুদির / কিছু_সুবদির") m
মাইকেল

1

অনুরূপ লাইনের পাশাপাশি (এবং আপনার কাঠামোর উপর নির্ভর করে) আমরা স্ক্রিনশটগুলি কোথায় সংরক্ষণ করব তা এইভাবে সমাধান করেছি:

আমাদের env সেটআপে (env.rb)

screenshotfolder = "./screenshots/#{Time.new.strftime("%Y%m%d%H%M%S")}"
unless File.directory?(screenshotfolder)
  FileUtils.mkdir_p(screenshotfolder)
end
Before do
  @screenshotfolder = screenshotfolder
  ...
end

এবং আমাদের hooks.rb এ

  screenshotName = "#{@screenshotfolder}/failed-#{scenario_object.title.gsub(/\s+/,"_")}-#{Time.new.strftime("%Y%m%d%H%M%S")}_screenshot.png";
  @browser.take_screenshot(screenshotName) if scenario.failed?

  embed(screenshotName, "image/png", "SCREENSHOT") if scenario.failed?

1

শীর্ষ উত্তরের "মূল লাইব্রেরি" কেবল সমাধানটি অসম্পূর্ণ ছিল। আপনি যদি কেবলমাত্র মূল গ্রন্থাগার ব্যবহার করতে চান তবে নিম্নলিখিতগুলি ব্যবহার করুন:

target_dir = ""

Dir.glob("/#{File.join("**", "path/to/parent_of_some_dir")}") do |folder|
  target_dir = "#{File.expand_path(folder)}/somedir/some_subdir/"
end

# Splits name into pieces
tokens = target_dir.split(/\//)

# Start at '/'
new_dir = '/'

# Iterate over array of directory names
1.upto(tokens.size - 1) do |n|

  # Builds directory path one folder at a time from top to bottom
  unless n == (tokens.size - 1)
    new_dir << "#{tokens[n].to_s}/" # All folders except innermost folder
  else
    new_dir << "#{tokens[n].to_s}" # Innermost folder
  end

  # Creates directory as long as it doesn't already exist
  Dir.mkdir(new_dir) unless Dir.exist?(new_dir)
end

আমার এই সমাধানটির প্রয়োজন ছিল কারণ ফাইল ইউটিলসের নির্ভরতা রত্ন rmagick আমার রেল অ্যাপগুলিকে অ্যামাজন ওয়েব পরিষেবাদিতে স্থাপন করা থেকে বাঁচিয়েছে যেহেতু rmagick সঠিকভাবে কাজ করতে libmagickwand-dev (Ubuntu) / imagemagick (OSX) প্যাকেজের উপর নির্ভর করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.