ডিরেক্টরিটি রুবির সাথে উপস্থিত না থাকলে তৈরি করুন


156

আমি নিম্নলিখিত কোড সহ একটি ডিরেক্টরি তৈরি করার চেষ্টা করছি:

Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
    unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")  

তবে, আমি এই ত্রুটিটি পাচ্ছি:

এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই - / ব্যবহারকারী / লুইজি / ডেস্কটপ / জরিপ_ফাইনাল / সংরক্ষণাগার / জরিপ / পরীক্ষা (এরনো :: ENOENT)

Dir.mkdirউপরের বিবৃতি দিয়ে এই ডিরেক্টরিটি তৈরি করা হচ্ছে না কেন ?


4
File.exists?()ফাইল এবং ফোল্ডারগুলিতে কাজ করে। এটা পার্থক্য জানে না।
টিন ম্যান

উত্তর:


263

আপনি সম্ভবত নেস্টেড ডিরেক্টরি তৈরি করার চেষ্টা করছেন। ধরে fooনেই যে বিদ্যমান নেই, আপনি এর জন্য no such file or directoryত্রুটি পাবেন :

Dir.mkdir 'foo/bar'
# => Errno::ENOENT: No such file or directory - 'foo/bar'

একবারে নেস্টেড ডিরেক্টরিগুলি তৈরি করতে, FileUtilsপ্রয়োজন:

require 'fileutils'
FileUtils.mkdir_p 'foo/bar'
# => ["foo/bar"]

সম্পাদনা 2: আপনাকে ব্যবহার করতে হবে না FileUtils, আপনি সিস্টেম কল করতে পারেন (@ মিমু থেকে আপডেট খুব ছোট মন্তব্য):

> system 'mkdir', '-p', 'foo/bar' # worse version: system 'mkdir -p "foo/bar"'
=> true

তবে এটি (কমপক্ষে আমার কাছে) মনে হচ্ছে আপনি যতটা বাহ্যিক 'সরঞ্জাম' ব্যবহার করছেন তার mkdirথেকেও খারাপ পদ্ধতির এটি কিছু সিস্টেমে অনুপলব্ধ হতে পারে (যদিও আমি খুব কমই সিস্টেমটি কল্পনাও করতে পারি না , তবে কে জানে)।


5
system 'mkdir', '-p', 'foo/bar'এই systemকলটির আরও ভাল সংস্করণ হবে। অতিরিক্ত শেল প্রক্রিয়া বা সাধারণ উদ্ধৃতি / পলায়ন / ইনজেকশন বাজে কথাগুলির প্রয়োজন নেই যা এর একক যুক্তির সংস্করণ সহ আসে system
মিউ খুব ছোট

6
systemস্ট্রিংটিকে /bin/shবিশ্লেষণ করতে আরম্ভ করবে mkdir -p "foo/bar"এবং তারপরে শেলটি চলবে /bin/mkdir। সুতরাং আপনি অতিরিক্ত কাজ করছেন (কমান্ড স্ট্রিং তৈরি করুন, /bin/shএটি আবার টেনে আনার জন্য প্রবর্তন করুন ) এবং সেই অতিরিক্ত কিছু কাজ আপনাকে শেল ইনজেকশন আক্রমণে খোলা রাখবে (রুবির জন্য সিইআরটি পরামর্শে কিছুটা সময় ব্যয় করবে এবং আপনি দেখতে পাবেন যে কতটা সাধারণ এই সমস্যাটি হ'ল)।
মিউ খুব ছোট

1
@muistooshort @ zrl3dx কীভাবে আবার systemকল করার চেয়ে ভাল fileutils? আমি উইন্ডোজে আছি এবং mkdir_pকেবল সাবস্কেল তৈরি না করে কেবল সূক্ষ্মভাবে কাজ করি mkdir -pযা যাইহোক ব্যর্থ হবে। খুশী fileutilsহ'ল উত্তরের প্রথম বিকল্প।
TWiStErRob

1
@ টিওয়ুইস্টেররবব: আমার মন্তব্যগুলি আবার পড়ুন, আমি এ সম্পর্কে কিছুই বলিনি fileutilsবা mkdir_p, আমি যা বলছি system command, arg1, arg2, ...তা তার চেয়ে ভাল system command_with_arguments
মিউ খুব ছোট

3
@ মিস্টুশোর্ট আহ, দুঃখিত, সুতরাং আপনি কেবল বলেছেন যে খারাপ বিকল্পটি করার একটি আরও ভাল উপায় আছে :)
টিউইউইস্টআরবব

71

সহজ উপায়:

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

8
কেউ ফাইল.ডাইরেক্টরি ব্যবহার করবে? ফাইল.এক্সেস্টদের চেয়ে?
ফ্লোরিন Asăvoaie

4
মনে করুন একই নামের একটি সাধারণ ফাইল আছে। আপনি সেরকম ক্ষেত্রে ডিরেক্টরি তৈরি করতে পারেন নি।
মিকোয়াজ রোজওয়াদস্কি

3
এটি একটি রেসের শর্ত তৈরি করে। ফাইলটি চেকের পরে তৈরি করা যেতে পারে তবে তৈরি করার আগে।
ডন রেবা

25

আর একটি সহজ উপায়:

Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')


যদি আপনি নেস্টেড ডিরেক্টরি তৈরি করতে চান তবে এটি কাজ করে না। উদাহরণস্বরূপ, আমি নিম্নলিখিত ডিরেক্টরি তৈরি করতে চেয়েছিলাম /home/jignesh/reports/testকিন্তু উত্থাপিত এই সমাধানটি ব্যবহার করে RUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir। সুতরাং নির্ভরযোগ্য সমাধানটি ব্যবহার করছেFileUtils.mkdir_p
জিগনেশ গোহেল

-5

ঠিক কীভাবে Dir.mkdir('dir') rescue nil?


3
rescueএর পরিবর্তক আকারে ব্যবহার করা এড়িয়ে চলুন ।
সেবাস্তিয়ান পালমা

1
আমাকে কেন কেবল 1 এর পরিবর্তে 5 টি লাইনের কোড লিখতে হবে তা বোঝার জন্য যত্নশীল? আমি আপনার চেষ্টা দেখতে চাই।
বিদার


1
আমি ইতিমধ্যে করেছি, এবং আমি সম্পূর্ণরূপে একমত নই, আমি মনে করি এটি নির্বোধ, যাতে আপনি আমাকে আলোকিত করতে পারেন?
বিদার

6
এটি এমন কোনও ব্যতিক্রম ধরা পড়বে যা আপনি করার চেষ্টা করছেন না এবং একটি আসল ওয়ার্ল্ড অ্যাপ্লিকেশনটিতে রক্ষণাবেক্ষণকে আরও শক্ত করে তুলতে সমস্যাগুলি আড়াল করবে। এছাড়াও, শর্তসাপেক্ষ হিসাবে ব্যতিক্রমগুলি ব্যবহার করা কোনও দুর্দান্ত ধারণা নয়, একটি হার্ডওয়ার অর্থে তারা অনেক ধীর গতিতে চালায় (সম্ভবত আধুনিক ভাষায় কোনও সমস্যা নয় তবে আপনাকে কোডার হিসাবে অনভিজ্ঞ দেখায়)।
এডি_
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.