পাঠ ৩৭ · ৫৬-এর মধ্যে · মডিউল ৯
Home / Courses / Operating Systems (OS) / ফাইল কনসেপ্ট

ফাইল কনসেপ্ট ও ফাইল অ্যাট্রিবিউট

File concept & file attributes
৭ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • ফাইল কী এবং কেন এটি OS-এর একটি মৌলিক অ্যাবস্ট্রাকশন — মেমরি (M7-M8) থেকে এটি কীভাবে আলাদা
  • একটি ফাইলের প্রতিটি স্ট্যান্ডার্ড অ্যাট্রিবিউট এবং প্রতিটি ঠিক কী তথ্য বহন করে
  • OS যেসব মৌলিক ফাইল অপারেশন সমর্থন করে তার তালিকা এবং প্রতিটির ভূমিকা
  • Python দিয়ে একটি টয় ইন-মেমরি "ফাইল মেটাডেটা টেবিল" — create/get/delete ফাংশন বাস্তবে কীভাবে কাজ করে তার একটি প্রিভিউ

১ · ফাইল কী — পারসিস্টেন্ট স্টোরেজের অ্যাবস্ট্রাকশন

ফাইল (File)FileOS-এর দেওয়া একটি অ্যাবস্ট্রাকশন — নন-ভোলাটাইল স্টোরেজে (ডিস্ক/SSD) সংরক্ষিত সম্পর্কিত তথ্যের একটি নামযুক্ত সংগ্রহ, যা পাওয়ার বন্ধ হয়ে গেলেও টিকে থাকে। হলো OS-এর দেওয়া সবচেয়ে গুরুত্বপূর্ণ অ্যাবস্ট্রাকশনগুলোর একটি — L01-এ যে "অ্যাবস্ট্রাকশন লেয়ার" ভূমিকার কথা বলা হয়েছিল, ফাইল ঠিক তারই একটি বাস্তব উদাহরণ। M7-M8-এ আমরা মেমরিMemoryভোলাটাইল (উদ্বায়ী) স্টোরেজ — পাওয়ার বন্ধ হয়ে গেলে সবকিছু হারিয়ে যায়। নিয়ে কাজ করেছি, যা ভোলাটাইল — পাওয়ার বন্ধ হলে সব হারিয়ে যায়। ফাইল ঠিক তার বিপরীত — নন-ভোলাটাইল স্টোরেজে (হার্ড ডিস্ক, SSD) সংরক্ষিত, যা রিবুটের পরও টিকে থাকে।

আপনি যখন একটি ফাইল সেভ করেন, আপনি জানেন না — এবং জানারও দরকার নেই — সেই ফাইলের ডেটা ডিস্কের ঠিক কোন ব্লক/সেক্টরে বসছে। আপনি শুধু একটি নাম দিয়ে ফাইলটি চেনেন এবং সেই নাম দিয়েই পরে সেটি খুঁজে বের করেন। এই রুক্ষ ডিস্ক-ব্লক বাস্তবতা লুকিয়ে রাখার পুরো কাজটাই ফাইল সিস্টেমের।

অ্যাপ্লিকেশন: "notes.txt খুলো" ফাইল অ্যাবস্ট্রাকশন — নাম + অ্যাট্রিবিউট ফাইল সিস্টেম — লোকেশন → ব্লক ম্যাপিং (L39) রও ডিস্ক ব্লক — ফিজিক্যাল সেক্টর
অ্যাপ্লিকেশন শুধু নাম জানে — ফাইল সিস্টেম ভেতরে ভেতরে নাম থেকে প্রকৃত ডিস্ক ব্লকে অনুবাদ করে।

২ · ফাইল অ্যাট্রিবিউট — কনটেন্ট নয়, মেটাডেটা

প্রতিটি ফাইলের সাথে তার নিজস্ব অ্যাট্রিবিউটFile Attributesফাইলের কনটেন্ট নয় — বরং ফাইল সম্পর্কে OS-এর ট্র্যাক রাখা মেটাডেটা। (মেটাডেটা) জড়িত থাকে — এগুলো ফাইলের ভেতরের আসল কনটেন্ট থেকে সম্পূর্ণ আলাদা তথ্য।

নাম (Name)
মানুষের পড়ার-যোগ্য নাম, একমাত্র মানুষ-বান্ধব ফর্ম্যাটে রাখা তথ্য।
আইডেন্টিফায়ার (Identifier)
OS-এর ভেতরের একটি ইউনিক আইডি, প্রায়ই নাম থেকে ভিন্ন — ফাইল রিনেম হলেও আইডেন্টিফায়ার একই থাকে।
টাইপ (Type)
ফাইলটি কোন ধরনের ডেটা ধারণ করে (টেক্সট, এক্সিকিউটেবল, ইমেজ...) — প্রায়ই এক্সটেনশন বা মেটাডেটায় এনকোড থাকে।
সাইজ (Size)
ফাইলের বর্তমান আকার, সাধারণত বাইটে — বরাদ্দ করা স্পেসের হিসাব রাখতে জরুরি।
লোকেশন (Location)
ফাইলের ডেটা ব্লক ডিস্কের ঠিক কোথায় আছে তার নির্দেশনা — L39-এর অ্যালোকেশন মেথডের বিষয়।
প্রোটেকশন (Protection)
কে পড়তে/লিখতে/এক্সিকিউট করতে পারবে — M11-এর অ্যাক্সেস কন্ট্রোল মডিউলের ভিত্তি।
টাইমস্ট্যাম্প (Timestamps)
তৈরি, সর্বশেষ পরিবর্তন ও সর্বশেষ অ্যাক্সেসের সময় — ব্যাকআপ ও অডিটের জন্য গুরুত্বপূর্ণ।
লক্ষ্য করুন — এই তালিকার কোনোটিই ফাইলের ভেতরের আসল বাইট (কনটেন্ট) নয়। এগুলো সবই ফাইল সম্পর্কে তথ্যের তথ্য — যা OS একটি আলাদা মেটাডেটা টেবিলে রাখে, নিচের কোড সেলে ঠিক এভাবেই একটি সরলীকৃত সংস্করণ দেখা যাবে।

৩ · ফাইল অপারেশন — OS যা প্রদান করে

OS একটি নির্দিষ্ট সেট ফাইল অপারেশনFile OperationsOS-এর প্রদান করা ফাইল ম্যানিপুলেশনের মৌলিক সেট — যেকোনো প্রোগ্রাম এই একই অপারেশন দিয়ে যেকোনো ফাইলের সাথে কাজ করে। প্রদান করে, যা দিয়ে যেকোনো প্রোগ্রাম যেকোনো ফাইলের সাথে কাজ করতে পারে —

  • create: একটি নতুন, খালি ফাইল তৈরি করা এবং মেটাডেটা টেবিলে এন্ট্রি বসানো।
  • open: ফাইলটি ব্যবহারের জন্য প্রস্তুত করা — এর মেটাডেটা মেমরিতে লোড করা।
  • read: ফাইলের কারেন্ট পজিশন থেকে ডেটা পড়া।
  • write: ফাইলের কারেন্ট পজিশনে ডেটা লেখা।
  • seek: ফাইলের ভেতরের "কারেন্ট রিড/রাইট পয়েন্টার" পুনঃস্থাপন করা — যেমন সরাসরি মাঝের কোনো অবস্থানে যাওয়া।
  • close: ফাইলটি বন্ধ করা — সংশ্লিষ্ট রিসোর্স মুক্ত করা।
  • delete: ফাইলটি ও তার মেটাডেটা এন্ট্রি সম্পূর্ণ মুছে ফেলা।
  • truncate: ফাইলের কনটেন্ট মুছে দিয়ে সাইজ শূন্যে নামিয়ে আনা, কিন্তু ফাইলটি (ও তার অ্যাট্রিবিউট) রেখে দেওয়া।

৪ · একটি টয় ফাইল-মেটাডেটা টেবিল

নিচের কোড সেলে একটি অতি-সরলীকৃত, সম্পূর্ণ ইন-মেমরি "ফাইল মেটাডেটা টেবিল" দেখা যাক — বাস্তব কোনো ডিস্ক I/O নয়, শুধুই ধারণা বোঝানোর সিমুলেশন। block_list ফিল্ডটি এখন খালি — L39-এ আমরা ঠিক এই ফিল্ডেই ফাইলের প্রকৃত ডেটা ব্লকের তালিকা রাখব।

Python
# L37 -- ফাইল মেটাডেটা টেবিল সিমুলেশন (toy in-memory, বাস্তব ফাইল সিস্টেম নয়)
file_table = {}
fake_clock = 0  # বাস্তব সময় নয় -- শুধু "কোনটা আগে তৈরি হলো" বোঝানোর জন্য একটি কাউন্টার

def create_file(name, size_bytes, permissions="rw-r--r--"):
    global fake_clock
    if name in file_table:
        print(f"তৈরি ব্যর্থ -> '{name}' ইতিমধ্যে বিদ্যমান")
        return
    fake_clock += 1
    file_table[name] = {
        "size": size_bytes,
        "permissions": permissions,
        "created_time": fake_clock,
        "block_list": [],   # L39-এ এই ফাইলের ডেটা ব্লকের তালিকা এখানে বসবে
    }
    print(f"তৈরি সফল -> '{name}' ({size_bytes} bytes, {permissions})")

def get_attributes(name):
    if name not in file_table:
        print(f"অ্যাট্রিবিউট খোঁজা ব্যর্থ -> '{name}' পাওয়া যায়নি")
        return None
    attrs = file_table[name]
    print(f"'{name}' -> size={attrs['size']}B, permissions={attrs['permissions']}, "
          f"created_time={attrs['created_time']}, blocks={attrs['block_list']}")
    return attrs

def delete_file(name):
    if name not in file_table:
        print(f"মুছে ফেলা ব্যর্থ -> '{name}' পাওয়া যায়নি")
        return
    del file_table[name]
    print(f"মুছে ফেলা সফল -> '{name}'")


create_file("notes.txt", 2048)
create_file("photo.jpg", 512000, permissions="rw-------")
create_file("notes.txt", 999)  # ডুপ্লিকেট -- ব্যর্থ হওয়া উচিত

get_attributes("notes.txt")
get_attributes("missing.txt")  # নেই -- ব্যর্থ হওয়া উচিত

delete_file("photo.jpg")
get_attributes("photo.jpg")  # এখন আর নেই

print("\n--- চূড়ান্ত ফাইল টেবিল ---")
for fname in file_table:
    print(fname)

    
মূল কথা · Key takeaway

ফাইল হলো OS-এর মৌলিক পারসিস্টেন্ট-স্টোরেজ অ্যাবস্ট্রাকশন — একটি নাম, তার সাথে জড়িত অ্যাট্রিবিউট (মেটাডেটা) এবং একটি স্ট্যান্ডার্ড অপারেশন সেট (create/open/read/write/seek/close/delete/truncate)। এই পাঠে আমরা শুধু একটি ফাইলকে বিচ্ছিন্নভাবে দেখলাম — পরের পাঠ (L38) থেকে দেখব হাজারো ফাইল একসাথে কীভাবে সংগঠিত থাকে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ ফাইলের "সাইজ" ও "লোকেশন" কেন আলাদা আলাদা অ্যাট্রিবিউট হিসেবে রাখা হয় — একটাতেই কি দুটো তথ্য একসাথে রাখা যেত না?

এই দুটো সম্পূর্ণ ভিন্ন প্রশ্নের উত্তর দেয়। সাইজ বলে "কত ডেটা আছে" — বাফার বরাদ্দ, প্রগ্রেস বার, বা কোটা হিসাবের জন্য দরকার। লোকেশন বলে "সেই ডেটা ঠিক কোথায় বসে আছে" — ডিস্কে পড়তে/লিখতে গেলে দরকার। একটি ফাইল রিলোকেট হলে (L39-এ ব্লক পুনর্বিন্যাস হলে) লোকেশন বদলাতে পারে অথচ সাইজ অপরিবর্তিত থাকে — এই দুটো আলাদা রাখাই বেশি নমনীয়, কারণ একটি বদলালেও অন্যটিকে স্পর্শ করতে হয় না।

প্র ০২ "নাম" আর "আইডেন্টিফায়ার" — দুটোই তো ফাইল চেনার কাজ করে, তাহলে দুটো আলাদা রাখার দরকার কী?

নাম মানুষের জন্য — সহজে মনে রাখা ও পড়ার জন্য, এবং এটি বদলানো যায় (রিনেম)। আইডেন্টিফায়ার OS-এর নিজের অভ্যন্তরীণ ব্যবহারের জন্য — এটি স্থায়ী, ফাইল রিনেম হলেও একই থাকে। যদি শুধু নাম দিয়েই OS ফাইল ট্র্যাক করত, তাহলে রিনেম করার সাথে সাথে ফাইলের সাথে জড়িত সবকিছু (খোলা হ্যান্ডেল, ব্লক ম্যাপিং) নতুন করে সংযুক্ত করতে হতো — আইডেন্টিফায়ার এই সমস্যা এড়িয়ে যায়, কারণ নাম বদলালেও ভেতরের আইডি অপরিবর্তিত থাকে।

প্র ০৩ কোড সেলে দ্বিতীয়বার "notes.txt" তৈরির চেষ্টা এবং "photo.jpg" মুছে ফেলার পর তার অ্যাট্রিবিউট চাওয়া — দুটোই ব্যর্থ হলো কেন, এবং এই দুটো ব্যর্থতা একসাথে কী প্রমাণ করে?

দুটোই file_table ডিকশনারির একই মৌলিক নিয়ম মেনে চলে — create_file একটি নাম ইতিমধ্যে "in" থাকলে প্রত্যাখ্যান করে (ডুপ্লিকেট এড়াতে), আর get_attributes একটি নাম টেবিলে না থাকলে প্রত্যাখ্যান করে (মুছে ফেলা বা কখনও তৈরি না হওয়া ফাইলের জন্য)। একসাথে এই দুটো প্রমাণ করে যে মেটাডেটা টেবিলটিই ফাইলের "সত্যিকারের অস্তিত্বের" একমাত্র উৎস — একটি ফাইল "আছে" মানেই তার এন্ট্রি এই টেবিলে আছে, আর "নেই" মানেই এন্ট্রি সরানো হয়েছে।

অনুশীলন

  1. চিন্তা করুন: আপনার কম্পিউটারে যেকোনো একটি ফাইলে রাইট-ক্লিক করে "Properties"/"Get Info" দেখুন — এই পাঠের কতগুলো অ্যাট্রিবিউট (নাম, সাইজ, তৈরির সময়, পারমিশন...) আপনি সরাসরি দেখতে পাচ্ছেন?

    প্রায় সবগুলোই সাধারণত সরাসরি দৃশ্যমান — নাম, সাইজ, টাইপ, তৈরি/পরিবর্তনের/অ্যাক্সেসের সময়, এবং পারমিশন (Windows-এ "Read-only" চেকবক্স বা Unix-এ rwx বিটের মাধ্যমে)। যেটা সাধারণত লুকানো থাকে তা হলো লোকেশন (ঠিক কোন ডিস্ক ব্লকে) এবং আইডেন্টিফায়ার (Unix-এ এটি inode নম্বর নামে পরিচিত, বিশেষ কমান্ড ছাড়া সাধারণত দেখা যায় না) — এগুলো OS-এর অভ্যন্তরীণ বিষয়, ব্যবহারকারীর দেখার প্রয়োজন নেই।

  2. পরীক্ষা করুন: উপরের কোড সেলে delete_file("photo.jpg")-এর পর একই নামে create_file("photo.jpg", 100) আবার চালিয়ে দেখুন — এটা কি সফল হবে, নাকি "ইতিমধ্যে বিদ্যমান" বলবে?

    এটি সফল হবে, কারণ delete_file ইতিমধ্যে file_table থেকে "photo.jpg" এন্ট্রি সম্পূর্ণভাবে সরিয়ে দিয়েছে (del file_table[name]) — তাই create_file-এর if name in file_table চেক এখন False ফেরত দেবে, এবং একটি সম্পূর্ণ নতুন এন্ট্রি (নতুন fake_clock মান সহ) তৈরি হবে। এটি দেখায় যে মুছে ফেলা মানে নামটি স্থায়ীভাবে "সংরক্ষিত" থাকা নয় — নামটি আবার পুনর্ব্যবহারযোগ্য হয়ে যায়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
ফ্রেম অ্যালোকেশন স্ট্র্যাটেজি