ফাইল নিয়ে কাজ করার ফাংশনগুলো 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"