फा

फाइल में Elixir

2 अभ्यास

फाइल के बारे में

फाइलों के साथ काम करने वाले फंक्शन File मॉड्यूल देता है।

पूरी फाइल पढ़ने के लिए File.read/1 का इस्तेमाल कीजिए। किसी फाइल में लिखने के लिए File.write/2 का इस्तेमाल कीजिए।

यह मॉड्यूल कॉपी करने, हटाने, नाम बदलने आदि के लिए भी फाइल फंक्शन देता है। इनके नाम UNIX में मौजूद समान फंक्शनों के नामों जैसे होते हैं, जैसे:

  • File.cp/3 - किसी फाइल की कॉपी बनाना।
  • File.rm/1 - किसी फाइल को हटाना।
  • File.rename/2 - किसी फाइल का नाम बदलना और/या उसे कहीं और ले जाना।
  • File.mkdir/1 - एक डायरेक्टरी बनाना।
  • File.cwd/0 - वर्तमान वर्किंग डायरेक्टरी पता करना।

File मॉड्यूल के ऊपर बताए गए सभी फंक्शनों का एक ! वाला वेरिएंट भी होता है, जो एरर टपल लौटाने के बजाय एक एरर उठा देता है (जैसे File.read!/1)। अगर आप फाइल न मिलने या अनुमतियों के अभाव जैसी एरर संभालने का इरादा नहीं रखते, तो उस वेरिएंट का इस्तेमाल कीजिए।

File.read("does_not_exist")
# => {:error, :enoent}

File.read!("does_not_exist")
# => ** (File.Error) could not read file "does_not_exist": no such file or directory
#        (elixir 1.10.4) lib/file.ex:353: File.read!/1

फाइलें और प्रोसेस

जब भी File.write/2 से किसी फाइल में लिखा जाता है, एक फाइल डिस्क्रिप्टर खुलता है और Elixir का एक नया प्रोसेस बनता है। इसी वजह से लूप के अंदर File.write/2 से फाइल में लिखने से बचना चाहिए।

इसके बजाय किसी फाइल को File.open/2 से खोला जा सकता है। File.open/2 का दूसरा आर्गुमेंट मोडों का एक ऐरे होता है, जिससे आप तय कर सकते हैं कि फाइल को पढ़ने के लिए खोलना है या लिखने के लिए।

आम तौर पर इस्तेमाल होने वाले मोड ये हैं:

  • :read - पढ़ने के लिए खोलता है, फाइल का मौजूद होना ज़रूरी है
  • :write - लिखने के लिए खोलता है, फाइल न हो तो बन जाती है, और उसमें मौजूद सामग्री के ऊपर लिख दिया जाता है
  • :append - लिखने के लिए खोलता है, फाइल न हो तो बन जाती है, और उसमें मौजूद सामग्री बनी रहती है

सभी मोडों की पूरी सूची के लिए File.open/2 का दस्तावेज़ देखिए।

File.open/2 उस प्रोसेस का PID लौटाता है जो उस फाइल को संभालता है। फाइल से पढ़ने और उसमें लिखने के लिए IO मॉड्यूल के फंक्शन इस्तेमाल कीजिए और इस PID को IO डिवाइस के रूप में पास कीजिए।

फाइल के साथ काम पूरा कर लेने पर उसे File.close/1 से बंद कर दीजिए।

file = File.open!("README.txt", [:write])
# => #PID<0.157.0>

IO.puts(file, "# README")
# => :ok

File.close(file)
# => :ok

फाइलों की स्ट्रीमिंग

File.read/1 से फाइल पढ़ने पर पूरी फाइल एक ही बार में मेमोरी में आ जाती है। बहुत बड़ी फाइलों के साथ काम करते समय यह एक समस्या बन सकती है। ऐसी फाइलों को कुशलता से संभालने के लिए आप File.open/2 और IO.read/2 की मदद से फाइल को एक-एक लाइन पढ़ सकते हैं, या File.stream/3 से फाइल को स्ट्रीम कर सकते हैं। स्ट्रीम Enumerable और Collectable दोनों प्रोटोकॉल लागू करती है, यानी इसका इस्तेमाल पढ़ने और लिखने, दोनों के लिए किया जा सकता है।

File.stream!("file.txt")
|> Stream.map(&(&1 <> "!"))
|> Stream.into(File.stream!("new_file.txt"))
|> Stream.run()

पाथ

फाइलों पर काम करने वाले सभी फंक्शनों को फाइल का पाथ चाहिए होता है। फाइल पाथ एब्सोल्यूट हो सकते हैं, या वर्तमान डायरेक्टरी के हिसाब से रिलेटिव। पाथों पर काम करने के लिए Path मॉड्यूल के फंक्शन इस्तेमाल कीजिए। क्रॉस-प्लेटफॉर्म कंपैटिबिलिटी के लिए पाथ बनाते समय Path.join/1 का इस्तेमाल कीजिए। यह प्लेटफॉर्म के हिसाब से सही सेपरेटर चुनेगा।

Path.expand(Path.join(["~", "documents", "important.txt"]))
"/home/user/documents/important.txt"
GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

फाइल सीखिए

अभ्यास लॉक है

फाइल पर अभ्यास करने के लिए 1 और अभ्यास अनलॉक कीजिए