ফাইল সিস্টেমের সাথে কাজ করা যেকোনো মোবাইল অ্যাপ্লিকেশনের ভিত্তি। প্রতিটি প্ল্যাটফর্ম তার নিজস্ব অ্যাক্সেস মডেল অফার করে: iOS-এ Sandbox অ্যাপ্লিকেশনগুলিকে আলাদা কন্টেইনারে বিচ্ছিন্ন করে, যেখানে Android-এ Scoped Storage শেয়ার্ড স্টোরেজে সরাসরি অ্যাক্সেস সীমাবদ্ধ করে। Google Developer Documentation (2026) অনুযায়ী, Android 10-এর সাথে Scoped Storage-এর প্রবর্তন ডেটা স্টোরেজ আর্কিটেকচারের সম্পূর্ণ পুনর্বিবেচনার প্রয়োজন করেছিল। এই গাইডে আমরা উভয় প্ল্যাটফর্মের জন্য FileManager, MediaStore API, Storage Access Framework এবং DocumentProvider কভার করব।
মূল বিষয়
মোবাইল অ্যাপ্লিকেশনে ফাইল সিস্টেম হল API, নিরাপত্তা নিয়ম এবং সীমাবদ্ধতার একটি সেট যা iOS এবং Android ডিভাইসে ডেটা সংরক্ষণ এবং অ্যাক্সেস নির্ধারণ করে। ডেস্কটপ অপারেটিং সিস্টেমের বিপরীতে, মোবাইল প্ল্যাটফর্ম প্রতিটি অ্যাপ্লিকেশনকে আলাদা করে যাতে ব্যবহারকারীর ডেটা অন্যান্য প্রোগ্রাম দ্বারা অননুমোদিত পড়া থেকে রক্ষা করা যায়।
iOS Sandbox মডেল ব্যবহার করে, যেখানে প্রতিটি অ্যাপ কঠোরভাবে সীমিত অনুমতি সহ নিজস্ব কন্টেইনারে বিদ্যমান। সংস্করণ 10-এর আগে, Android বাহ্যিক স্টোরেজে সম্পূর্ণ অ্যাক্সেস প্রদান করত, কিন্তু Scoped Storage-এর প্রবর্তনের সাথে, পদ্ধতিটি iOS-এর কাছাকাছি হয়ে গেছে। মূল পার্থক্য হল iOS ফাইল সিস্টেমকে সম্পূর্ণরূপে বিচ্ছিন্ন করে, যেখানে Android বেশ কয়েকটি অ্যাক্সেস স্তর অফার করে: একটি ব্যক্তিগত ডিরেক্টরি, পাবলিক MediaStore এবং SAF-এর মাধ্যমে অস্থায়ী অ্যাক্সেস।
মোবাইল অ্যাপ্লিকেশন তিন ধরনের ডেটা স্টোরেজ ব্যবহার করে। ব্যক্তিগত স্টোরেজ — অভ্যন্তরীণ ফাইল এবং ক্যাশের জন্য শুধুমাত্র অ্যাপের জন্য অ্যাক্সেসযোগ্য ডিরেক্টরি। শেয়ার্ড স্টোরেজ — MediaStore (Android) বা Files App (iOS)-এর মাধ্যমে মিডিয়া ফাইল। ক্লাউড স্টোরেজ — ডিভাইসের মধ্যে সিঙ্ক্রোনাইজেশনের জন্য iCloud Drive এবং Google Drive। প্রতিটি প্রকারের আকার, ফাইল জীবনকাল এবং অ্যাক্সেস শর্তাবলীর উপর নিজস্ব সীমা রয়েছে।
| স্টোরেজ প্রকার | iOS | Android |
|---|---|---|
| ব্যক্তিগত | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| শেয়ার্ড মিডিয়া | PHPhotoLibrary পিকারের মাধ্যমে | MediaStore API (ContentResolver) |
| শেয়ার্ড ডকুমেন্ট | UIDocumentPicker-এর মাধ্যমে Files App | Storage Access Framework (SAF) |
| ক্লাউড | iCloud Drive (UIDocument) | Google Drive API |
| ক্যাশ | Caches ডিরেক্টরি, সিস্টেম দ্বারা পরিষ্কার | getCacheDir(), getExternalCacheDir() |
Sandbox হল iOS-এর নিরাপত্তা আর্কিটেকচার যা প্রতিটি অ্যাপ্লিকেশনকে বিচ্ছিন্ন করে। একটি অ্যাপ শুধুমাত্র নিজস্ব স্যান্ডবক্সের ভিতরে পড়তে এবং লিখতে পারে। পরিচিতি, ফটো বা অন্যান্য অ্যাপের ফাইল অ্যাক্সেস করতে, সিস্টেম পিকার ব্যবহার করতে হবে: UIImagePickerController বা UIDocumentPickerViewController। Files App-এ অ্যাক্সেস Info.plist-এ UIFileSharingEnabled ফ্ল্যাগের মাধ্যমে কনফিগার করা হয়। iOS-এ মোবাইল ডেভেলপমেন্টে ফাইল সিস্টেমের জন্য ডিরেক্টরি কাঠামো বোঝা এবং প্রতিটি ডেটা প্রকারের জন্য সঠিক অবস্থান নির্বাচন করা প্রয়োজন।
iOS স্যান্ডবক্সে বেশ কয়েকটি স্ট্যান্ডার্ড ডিরেক্টরি রয়েছে। Documents — ব্যবহারকারীর ফাইলের জন্য, iCloud Backup-এ অন্তর্ভুক্ত। Caches — অস্থায়ী ডেটার জন্য যা স্টোরেজ কম হলে সিস্টেম মুছে ফেলতে পারে। Temporary — বর্তমান সেশনের ফাইলের জন্য, পুনরায় চালু হলে পরিষ্কার হয়। Application Support — ব্যবহারকারীর কাছ থেকে লুকানো অভ্যন্তরীণ অ্যাপ ডেটার জন্য। ভুল ডিরেক্টরি নির্বাচন করলে সমস্যা হয়: Documents-এ ক্যাশ সংরক্ষণ iCloud স্থান নষ্ট করে এবং Apple-এর ফাইল সিস্টেম নির্দেশিকা লঙ্ঘন করে।
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
let fileURL = documentsURL.appendingPathComponent("notes.txt")
let text = "Содержимое файла"
// এটমিক রাইটিং এনক্রিপশন সহ
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
FileManager ক্লাস iOS-এ ফাইল পরিচালনার জন্য পদ্ধতির একটি সম্পূর্ণ সেট প্রদান করে। FileManager.default একটি থ্রেড-সেফ সিঙ্গলটন যা বেশিরভাগ অপারেশনের জন্য উপযুক্ত। fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) এবং removeItem(at:) এর মতো পদ্ধতি মৌলিক পরিস্থিতি কভার করে। 1 MB-এর বড় ফাইল অপারেশন DispatchQueue.global()-এর মাধ্যমে ব্যাকগ্রাউন্ড থ্রেডে করা উচিত। বড় ভলিউম স্ট্রিমিংয়ের জন্য, পুরো ফাইল মেমরিতে লোড করার পরিবর্তে FileHandle ব্যবহার করুন।
func readDocumentsFile(named fileName: String) -> String? {
guard let docsURL = FileManager.default.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return nil }
let fileURL = docsURL.appendingPathComponent(fileName)
return try? String(contentsOf: fileURL)
}
Android 10 প্রকাশের সাথে, Google Scoped Storage চালু করেছে — ফাইল সিস্টেমে সীমাবদ্ধ অ্যাক্সেসের একটি মডেল। একটি অ্যাপ শুধুমাত্র নিজস্ব ব্যক্তিগত ডিরেক্টরিতে অবাধে পড়তে এবং লিখতে পারে। মিডিয়া ফাইলের (ছবি, ভিডিও, অডিও) জন্য, ContentResolver-এর মাধ্যমে MediaStore API ব্যবহার করা হয়। ইচ্ছামত ডকুমেন্টের জন্য, Intent ACTION_OPEN_DOCUMENT-এর মাধ্যমে Storage Access Framework ব্যবহার করা হয়। Android 11+-এ, বাহ্যিক স্টোরেজের রুটে সরাসরি অ্যাক্সেস সম্পূর্ণরূপে নিষিদ্ধ, এবং সমস্ত ডেভেলপারকে নতুন API ব্যবহার করতে হবে।
MediaStore ডিভাইসে মিডিয়া ফাইল অ্যাক্সেস করার জন্য একটি সিস্টেম ContentProvider। ContentResolver-এর মাধ্যমে, অ্যাপ সরাসরি পাথের পরিবর্তে ফাইল Uri অনুরোধ করে। MediaStore.Files — সব ফাইল প্রকারের জন্য, Images — ছবির জন্য, Video — ভিডিওর জন্য, Audio — অডিও রেকর্ডিংয়ের জন্য। শেয়ার্ড ডিরেক্টরিতে লেখা DISPLAY_NAME, MIME_TYPE এবং RELATIVE_PATH সহ insert()-এর মাধ্যমে করা হয়। সন্নিবেশের পরে, অ্যাপ একটি Uri পায় যার মাধ্যমে বাইট লেখা হয়। MIME প্রকার একটি গুরুত্বপূর্ণ ভূমিকা পালন করে — ভুল প্রকার ফাইল খোলার সময় ত্রুটির কারণ হবে।
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "report.pdf")
put(MediaStore.MediaColumns.MIME_TYPE, "application/pdf")
put(MediaStore.MediaColumns.RELATIVE_PATH, "Documents/Reports")
}
val uri = contentResolver.insert(
MediaStore.Files.getContentUri("external"),
contentValues
)
uri?.let {
contentResolver.openOutputStream(it)?.use { stream ->
stream.write(pdfBytes)
}
}
SAF রানটাইম অনুমতি ছাড়া ফাইল নির্বাচন এবং তৈরি করার জন্য একটি ইউনিফাইড ইন্টারফেস প্রদান করে। Intent ACTION_OPEN_DOCUMENT Android-এ সিস্টেম ফাইল ম্যানেজার খোলে। নির্বাচনের পরে, অ্যাপ FLAG_GRANT_READ_URI_PERMISSION-এর মাধ্যমে অস্থায়ী অ্যাক্সেস সহ content:// Uri পায়। ACTION_CREATE_DOCUMENT ব্যবহারকারীর নির্বাচিত যেকোনো বাহ্যিক স্টোরেজ অবস্থানে ফাইল সংরক্ষণের অনুমতি দেয়। SAF Android 5+ এ কাজ করে এবং DocumentsProvider-এর মাধ্যমে সংযুক্ত ক্লাউড প্রদানকারীদের ফাইলে অ্যাক্সেস প্রদান করে।
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
"application/pdf",
"text/plain"
))
}
startActivityForResult(intent, REQUEST_CODE)
উভয় প্ল্যাটফর্ম ব্যবহারকারীদের ফাইল নির্বাচনের জন্য বিল্ট-ইন মেকানিজম প্রদান করে। মোবাইল অ্যাপ্লিকেশনে ডকুমেন্ট সিস্টেম পিকারের মাধ্যমে পাস করা হয় যা স্থায়ী অনুমতি ছাড়া ফাইলের অস্থায়ী অ্যাক্সেস দেয়। iOS-এ, এটি UIDocumentPickerViewController; Android-এ, ACTION_OPEN_DOCUMENT। মোবাইল অ্যাপ্লিকেশনে ডকুমেন্ট স্থানীয় স্টোরেজ এবং ক্লাউড পরিষেবা উভয় থেকেই নির্বাচন করা যেতে পারে। ব্যবহারকারী স্পষ্টভাবে ফাইল নির্দিষ্ট করে, এবং অ্যাপ সীমিত বৈধতা সময়কাল সহ Uri বা URL পায়।
UIDocumentPickerViewController Files App খোলে এবং এক বা একাধিক ডকুমেন্ট নির্বাচনের অনুমতি দেয়। মোড: ইম্পোর্ট (স্যান্ডবক্সে কপি) এবং ওপেন (সিকিউরিটি-স্কোপড URL-এর মাধ্যমে অ্যাক্সেস)। ফাইল ফিল্টারিংয়ের জন্য, UTType প্রকারের একটি অ্যারে পাস করা হয় — উদাহরণস্বরূপ, .pdf এবং .plainText। URL পাওয়ার পরে, অ্যাপকে পড়ার আগে startAccessingSecurityScopedResource() এবং শেষ করার পরে stopAccessingSecurityScopedResource() কল করতে হবে। stopAccessing কল করতে ব্যর্থ হলে সিস্টেম রিসোর্স লিক হয়। iOS-এ মোবাইল অ্যাপ্লিকেশনে ডকুমেন্টের জন্য ফাইলের সাথে কাজ শেষ করার পরে অস্থায়ী অনুমতি বাধ্যতামূলকভাবে মুক্তি প্রয়োজন।
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// ডেলিগেটে অ্যাক্সেস মুক্তি
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider অ্যাপের মধ্যে নিরাপদে ফাইল শেয়ার করার জন্য ContentProvider-এর একটি উপশ্রেণী। এটি নির্দিষ্ট XML ডিরেক্টরি থেকে ফাইলের উপর ভিত্তি করে অস্থায়ী content:// Uri তৈরি করে। অন্যান্য অ্যাপ FLAG_GRANT_READ_URI_PERMISSION সহ Intent-এর মাধ্যমে অ্যাক্সেস পায়। DocumentProvider, FileProvider-এর বিপরীতে, SAF-এ ফাইল প্রকাশ করে এবং অন্যান্য অ্যাপকে আপনার অ্যাপের বিষয়বস্তু ফাইল সিস্টেমের অংশ হিসাবে ব্রাউজ করার অনুমতি দেয়। DocumentsProvider বাস্তবায়নের জন্য, আপনাকে queryRoots(), queryChildDocuments() এবং openDocument() ওভাররাইড করতে হবে, তারপর AndroidManifest.xml-এ রেজিস্টার করতে হবে।
ক্লাউড সিঙ্ক্রোনাইজেশন ব্যবহারকারীদের তাদের সকল ডিভাইসে ডকুমেন্টে অ্যাক্সেস দেয়। মোবাইল অ্যাপ্লিকেশনে ফাইল সিস্টেম একটি ক্লাউড লেয়ার দ্বারা বর্ধিত হয়: iOS-এ UIDocument স্বয়ংক্রিয়ভাবে পরিবর্তন ট্র্যাক করে এবং iCloud-এর মাধ্যমে সিঙ্ক করে। Android-এ, অনুরূপ কার্যকারিতা Google Drive API বা ক্লাউড রুট সহ DocumentsProvider-এর মাধ্যমে তৈরি করা হয়। ক্রস-ডিভাইস সিঙ্ক্রোনাইজেশন তৈরির জন্য মোবাইল ডেভেলপমেন্টে ফাইল সিস্টেম বোঝা গুরুত্বপূর্ণ।
UIDocument iCloud ডকুমেন্টের সাথে কাজ করার জন্য একটি অ্যাবস্ট্রাক্ট ক্লাস। এটি স্বয়ংক্রিয়ভাবে পরিবর্তন সংরক্ষণ করে, ডেটা পড়ে এবং ডেলিগেটকে আপডেট সম্পর্কে জানায়। লেখার দ্বন্দ্বে, NSFileVersion উপলব্ধ সংস্করণের একটি তালিকা প্রদান করে — ডেভেলপার সর্বশেষটি বেছে নিতে পারেন বা ব্যবহারকারীকে দ্বন্দ্ব সমাধানের বিকল্প দেখাতে পারেন। iCloud Drive-এর জন্য প্রকল্পের ক्षमতায় Ubiquity Container কনফিগার করা বাধ্যতামূলক। NSFileCoordinator এবং NSFilePresenter একাধিক থ্রেড বা ডিভাইস থেকে সমবর্তী অ্যাক্সেসের সময় ডেটা রেস প্রতিরোধ করে।
iOS স্বয়ংক্রিয়ভাবে Documents ডিরেক্টরিকে iCloud Backup-এ অন্তর্ভুক্ত করে। Android Auto Backup for Apps-এর সাথে কাজ করে — সিস্টেম getFilesDir(), SharedPreferences এবং SQLite ডাটাবেস থেকে ডেটা Google Drive-এ সংরক্ষণ করে। ক্যাশ এবং বাহ্যিক ফাইল ব্যাকআপে অন্তর্ভুক্ত নয়। উভয় প্ল্যাটফর্ম ব্যতিক্রম কনফিগার করার অনুমতি দেয়: iOS-এ NSURLIsExcludedFromBackupKey-এর মাধ্যমে, Android-এ ব্যাকআপ নিয়মের XML কনফিগারেশনের মাধ্যমে। ব্যক্তিগত ডেটা সহ ফাইলের এনক্রিপশন বাধ্যতামূলক — iOS-এ NSDataWritingFileProtectionComplete ব্যবহার করুন, Android-এ security-crypto লাইব্রেরি থেকে EncryptedFile ব্যবহার করুন।
| প্যারামিটার | iOS | Android |
|---|---|---|
| ডিফল্ট ব্যাকআপ | Documents এবং Library | getFilesDir(), SharedPreferences, DB |
| ফাইল ব্যতিক্রম | isExcludedFromBackupKey | XML ব্যাকআপ নিয়ম (fullBackupContent) |
| এনক্রিপশন | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| ক্লাউড সিঙ্ক | UIDocument + iCloud | Google Drive API + SAF |
| অটো রিস্টোর | ইনস্টলেশনের পরে iCloud Restore | পুনরায় ইনস্টলে Auto Backup |
সচরাচর জিজ্ঞাসিত প্রশ্ন
Sandbox iOS-এ প্রতিটি অ্যাপের জন্য একটি বিচ্ছিন্ন পরিবেশ। UIDocumentPickerViewController-এর মতো সিস্টেম পিকার ব্যবহার ছাড়া অ্যাপ অন্যান্য অ্যাপের ফাইল অ্যাক্সেস করতে পারে না।
Scoped Storage Android 10+-এ ফাইল সিস্টেমে সীমাবদ্ধ অ্যাক্সেসের একটি মডেল। অ্যাপ সরাসরি শুধুমাত্র নিজস্ব ফাইল পড়ে, মিডিয়ার জন্য MediaStore API এবং ডকুমেন্টের জন্য Storage Access Framework ব্যবহার করে।
UIDocumentPickerViewController ব্যবহার করুন — Files App বা iCloud Drive থেকে ডকুমেন্ট নির্বাচনের জন্য সিস্টেম পিকার। নির্বাচনের পরে, আপনি অস্থায়ী অ্যাক্সেস সহ একটি সিকিউরিটি-স্কোপড URL পান।
মিডিয়া ফাইলের জন্য, MIME প্রকার উল্লেখ করে ContentResolver-এর মাধ্যমে MediaStore API ব্যবহার করুন। ইচ্ছামত ডকুমেন্টের জন্য, Intent ACTION_OPEN_DOCUMENT সহ Storage Access Framework ব্যবহার করুন।
FileProvider FLAG_GRANT_READ_URI_PERMISSION সহ অস্থায়ী content:// Uri-এর মাধ্যমে অ্যাপের মধ্যে নিরাপদে ফাইল শেয়ার করার জন্য ContentProvider-এর একটি উপশ্রেণী।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।