C# এ ফাইল নিয়ে কাজ করাঃ ফাইল অপারেশন ।

ফাইলে ডেটা জমা রাখা কিংবা ফাইলে ডেটা স্টোর করা প্রোগ্রামিং এর বেশ অ্যাডভান্সড একটা টপিক। এমনকি প্রোগ্রামিং ল্যাঙ্গুয়েজের কোর্স বা বইগুলোতেও দেখা যায় ফাইল অপারেশন সবার শেষে ধরা হয়। কারণ একটাই । কাজটা নেহায়েত সহজ না নাকি। আমার কাছে তো সহজ লাগলো । অবশ্য সহজ কঠিন ব্যাপারটা আপেক্ষিক বিষয় । যার কাছে যেমন লাগে । তাও আমি আমার আতেলিয় জ্ঞান পরিহার করে যথাসম্ভব সহজ করে ব্যাপারটা বুঝানোর চেষ্টা করবো। হ্যাঁ C# দিয়ে ।

শুরু করার আগে – ফাইল নিয়ে প্রোগ্রাম কীভাবে কাজ করে?

ফাইল এ ডেটা লেখালেখি করার আগে কিছু কথা । ফাইল আসলে কি, আর একটা কম্পিউটার প্রোগ্রাম কীভাবে সেটার অ্যাকসেস পায়? জিনিসটাকে এভাবে দেখা যাক – ফাইল আসলে কি? কতগুলো ডেটার একটা স্টোরেজ। ফাইলে ডেটা থাকে । কম্পিউটার কাজ করে ডেটা নিয়ে । তো কম্পিউটারের স্বভাব হচ্ছে কাজ করার সময় সে সবকিছু মেমরিতে মানে র‍্যামে লোড করে নেয়। কম্পিউটারেরে মেমরি থেকে তখন ডেটা নিয়ে প্রোগ্রাম কাজ করে । মেমরীর এই পুরো ডেটা ওয়ালা অংশটা হচ্ছে একটা ডেটা স্ট্রিম মানে ডেটার প্রবাহ। আর স্ট্রিমের একটা অংশ বিশেষ হচ্ছে বাফার।

ব্যাপারটা জটিল হয়ে গেলো । সহজ করি। ধরা যাক, আপনাকে একটা এনসাইক্লোপিডিয়া ধরিয়ে দিয়ে বলা হলো সেখান থেকে ঘানা সম্পর্কিত  এন্ট্রিটা নিয়ে কাজ করতে । অর্থাৎ আপনাকে কাজ শুধু ঘানা নিয়েই করা লাগবে । পুরো এনসাইক্লোপিডিয়া নিয়ে নয় । এনসাইক্লোপিডিয়া হচ্ছে এখানে  স্ট্রিম। আর আপনি কাজ করছেন ঘানার তথ্য মানে বাফার নিয়ে ।

এখন স্ট্রিম কিন্তু শুধু ফাইল না! আপনার প্রোগ্রামটাও একটা স্ট্রিম! বিষয়টা ভালো করে বুঝা যায় কনসোল অ্যাপ্লিকেশন গুলোতে । সেখানে আমরা যখন C# এ  Console.WriteLine, C++ এ std::cout দিয়ে কিছু প্রিন্ট করি, আমরা আসলে তখন মেমরিতে প্রোগ্রামের আউটপুটের জন্য যে স্ট্রিম তৈরি হয়েছে সেটাতে প্রিন্ট করি। cout এর out শব্দটা দেখে ব্যাপারটা আন্দাজ করা যায় । আবার যখন ইনপুট দেই, তখনো ইনপুটের জন্য ইনপুট স্ট্রিম থাকে। তাই আপনি ইনপুট আউটপুট যাই দেন , সব ঘুরে ফিরে সেই স্ট্রিমেই যায় । আর যখন ডেটার অংশবিশেষ চান – তখন সেটা হয়ে যায় বাফার।

C# এ ফাইল অপারেশন – কিছু বেসিক জিনিস ->

C# এ ফাইল অপারেশনের জন্য আমার একটা ফাইল স্ট্রিম লাগবে আর স্ট্রিমে ডেটার রাইট / রিড করার জন্য স্ট্রিম রাইটার বা স্ট্রিম রিডার লাগবে। আমি অ্যাডভান্সড কিছুতে যাচ্ছি না । একেবারে সহজ পদ্ধতিতে কীভাবে ফাইল নিয়ে কাজ করা যায় সেটাই দেখাবো।

ফাইল স্ট্রিমের জন্য আমার FileStream ক্লাসের একটা অবজেক্ট লাগবে। আর রাইটিং এর জন্য StreamWriter এবং রিডিং এর জন্য StreamReader এর অবজেক্ট লাগবে । FileStream এর অবজেক্ট একটা ফাইল নিয়ে একটা স্ট্রিম তৈরি করে নিবে আর রাইটার রিডার দিয়ে সেগুলোতে ডেটা রিড বা রাইট করা যাবে । আর এইসব ক্লাসের জন্য একটা আলাদা নেমস্পেস আছে C# এ। সেটা হচ্ছে System.IO

শুরু করি

ভিজুয়াল স্টুডিও তে একটা কনসোল অ্যাপ্লিকেশন প্রোজেক্ট ওপেন করি। নাম আপনি যা খুশি দেন আপনার ব্যাপার। তবে একটু কষ্ট করে যে ফোল্ডারে সেভ করছেন , সে ফোল্ডার টা উইন্ডোজ এক্সপ্লোরারে ওপেন রাখবেন। কেন? পরে বলছি ।

কোডের শুরুতে যে কাজ করবো , নেমস্পেস টাকে কল করে নিবো ।

using System.IO; লিখে দিলেই কাজ হয়ে যাচ্ছে ।

এরপর , আমার একটা StreamWriter অবজেক্ট লাগবে, একটা FileStream অবজেক্ট লাগবে আর ডেটা রাখার জন্য একটা স্ট্রিং। আমি ফাইলে শুধু স্ট্রিং আউটপুট দিবো উদাহরণ হিসেবে। ইন্টিজার, ফ্লোট অন্যান্য টাইপের জন্য পদ্ধতি একই। কমপ্লেক্স টাইপ বা ক্লাসের অবজেক্টের আউটপুট নেবার জন্য ক্লাস সেভাবে ডিজাইন করে নিতে পারেন, তবে সেটাতে আমি যাচ্ছি না । বেশি অ্যাডভান্সড ব্যাপার।

writer

কোডটায় আমি যা করেছি, প্রথমে, স্ট্রিং ভেরিয়েবলে ফাইলে যা প্রিন্ট করবো তা স্টোর করেছি । এরপর writer এবং file নামের অবজেক্ট দুটো ডিক্লেয়ার করে দিয়েছি।

ফাইল অ্যাকসেস মোড

FileStream এর অবজেক্ট বানানোর জন্য এর কন্সট্রাক্টরে ফাইলের পাথ, ফাইল অ্যাকসেস মোড, এবং ফাইল অ্যাকসেস পারমিশন উল্লেখ করে দিতে হবে। আমি এখানে ফাইল অ্যাকসেস মোড দিয়েছি Create। আমার ফাইল আগে তৈরি করা ছিলো না। প্রোগ্রাম রান হবার সময় নিজেই তৈরি করে নিবে। ধরা যাক, আপনি আগে ফাইল বানিয়ে রেখেছেন। তখন? অ্যাকসেস মোড হিসেবে Open দিবেন। অথবা যদি নিশ্চিত না থাকেন, OpenOrCreate দিলে ঝামেলা মিটে যাবে ।

ফাইল অ্যাকসেস পারমিশন

.NET সিকিউরিটির ব্যাপারে অতিরিক্ত খুঁতখুঁতে। আপনার প্রোগ্রাম যাতে কোন প্রোগ্রামিং এররের কারণে কোন ফাইলের ডেটা বদলাতে বা মুছে ফেলতে না পারে সেজন্য তারা ফাইল স্ট্রিমের সাথে অ্যাকসেস পারমিশন দিয়েছে যে ফাইলে প্রোগ্রাম কি ধরণের কাজ করতে পারবে। শুধু রাইট, শুধু রিড, নাকি রাইট রিড দুটোই নাকি আগে থেকে থাকা ডেটার সাথে নতুন ডেটা যোগ মানে অ্যাপেন্ড করা। আপনার কাজের উপর নির্ভর করে সেটা বেছে নিতে হবে । আমার কাজ এখানে ফাইল এ ডেটা রাইট করা। তাই আমি Write নিয়েছি। Append করতে চাইলে FileAccess.Append নিলেই হবে।

এক্সেপশন?

ফাইল নিয়ে কাজ করার সময় প্রোগ্রাম অনেক রকমের এক্সেপশন দিতে পারে। ব্যাপারটা সহজ রাখার জন্য জেনেরিক এক্সেপশন টাইপ দিয়ে কাজ চালানো ভালো (সাধারণ কাজের জন্য অবশ্যই এবং বড়সড় প্রোজেক্টে অবশ্যই না!)। কি ধরণের এক্সেপশন থ্রো হয়েছে সেটা জানার জন্য Message প্রোপার্টি টা আছে । ধরে ডাক দিলে মানে কল দিলেই হবে। প্রোগ্রামে সব কাজ শেষে finally ব্লকটা জানিয়ে দিবে যে ফাইলে ডেটা রাইট হয়েছে।

ফাইলে ডেটা কোন মেথড দিয়ে রাইট হবে?

আগেই বলেছি, ফাইল কনসোল সবই স্ট্রিম। মেথডগুলোও তাই একই। আপনি কনসোলে প্রিন্ট করতেন WriteLine() দিয়ে । এখানেও তাই করবেন। শুধু স্ট্রিমের নাম বদলাবে।

ফাইল কোথায়? খুঁজে পেয়েছেন?

এহেম এহেম। প্রথমে কাজ করতে গিয়ে সবাই এই ঝামেলায় পড়েন। মনে আছে বলেছিলাম ফোল্ডার টা ওপেন রাখতে? সেখানে যান। সেখানে bin ফোল্ডারের ভেতরে ডিবাগ ফোল্ডার পাবেন। (যদি প্রোগ্রাম রিলিজ মোডে বিল্ড করে থাকেন তাহলে release ফোল্ডারে থাকবে )

ফাইলটা ওপেন করুন। আপনি ডেটা দেখতে পাবেন। মানে ফাইলে ডেটা রাইটিং শেষ। এবার একটু দম ফেলেন। পানি খান। মানুষের মস্তিষ্ক পানি ছাড়া ভালো কাজ করেনা। বেশি করে পানি খান। আপনি ফাইল অপারেশনের অর্ধেক পারেন এখন। কনগ্র্যাটস! বাকি রইলো কি তাহলে? রিড অপারেশন। সেটা আমি এত ব্যাখ্যায় যাবো না । শুধু কোডটা দিয়ে বুঝাবো। আগের ব্যাখ্যা থেকে নিজেই বুঝবেন।

রাইটের সাথে রিড অপারেশনের কোডের তফাত কোথায়?

তফাত হচ্ছে , অবজেক্ট এ । এতক্ষন রাইটার অবজেক্ট দিয়ে কাজ করে নিয়েছেন। এখন রিডার অবজেক্ট লাগবে। অর্থাৎ StreamReader। বাকি ফাইল স্ট্রিমে অ্যাকসেস মোড এবং অ্যাকসেস পারমিশন বদলানো লাগবে । কেমন?

অ্যাকসেস মোডঃ FileMode.Open , অ্যাকসেস পারমিশনঃ FileAccess.Read ।

এরপর যেহেতু এবার ফাইল থেকে ইনপুট নিচ্ছেন। মেথড খানা বদলাবে। আবার আগের উল্টো হবে। আগে ছিলো WriteLine() এখন হবে ReadLine()। আর ইনপুট নেবার সময় কোডে একটা ছোট্ট সংযোজন হচ্ছে , EOF চেক করা। EOF মানে এন্ড অফ ফাইল । এরপরে ফাইলে আর কোন ডেটা থাকে না। সেটার জন্য একটা লুপ দিয়ে reader.ReadLine() != null কন্ডিশন চেক করলেই হবে। যখন এই কন্ডিশন False হয়ে যাবে তখন ফাইল রিডিং বন্ধ হয়ে যাবে।

এবার একটা কথা । আসল কথা আসলে। ফাইল যদি আপনি নিজে আগে বানিয়ে থাকেন সেটা কোথায় রাখবেন?

ফাইল কোথায় থাকবে?

ফাইল আপনি আপনার ডিস্ক ড্রাইভের যেকোন ডিরেক্টরিতে রাখতে পারেন। তার ফুল পাথনেমটা FileStream অবজেক্ট ইন্সট্যানশিয়েট করার সময় দিলেই হবে । অথবা , আপনার কাজ যদি অতি সাধারণ হয়, যেমন আমি করছি, আগের মতন debug অথবা release ফোল্ডারে ফাইলটা সেভ করে নিবেন। যদি না করেন তাহলে, কি আর হবে? এক্সেপশন থ্রো করবে। মানে এরর।

তো কোডের চেহারা দেখি । তফাতগুলো দুটো কোড মেলালেই টের পাবেন। আমি কোডের লিংক ও দিয়ে দিচ্ছি শেষে। আপনার বারবার ছবি মেলাতে যাতে না হয়।

যাহা লইয়াছো তাহা দিয়ো ফেরত

একটা ভালো প্র্যাকটিস। মানে কোডে কোন লিক রাখতে না চাইলে আরকি। দয়া করে রিসোর্স গুলো Close করে দিলে ভালো দেখায় । ভবিষ্যত এরর এড়ানোর জন্য। পরে কাজে লাগলেও লাগতে পারে।

রিড রাইট অনেক হয়েছে , আমি অ্যাপেন্ড করতে চাই

শুধু ফাইল অ্যাকসেস পারমিশন এ FileMode.Append দিবেন। আপনার কাজ হয়ে যাবে।

কোড গুলো কি দিবেন এহেম এহেম ……?

না দিয়ে আর যাবো কই? লিংক গুলো দিচ্ছি ।

১ / রাইট অপারেশন

২/ রিড অপারেশন

এছাড়া MSDN লাইব্রেরী সবসময় ই আছে সবচাইতে ভালো রিসোর্স হিসেবে। সেখানেও ঢু মেরে আসতে পারেন। তো এই ছিলো C# এ ফাইল অপারেশন। এত বড় একটা লেখা ধৈর্য ধরে পড়ার জন্য ধন্যবাদ ।

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s