FileManager — ay isang klase mula sa Foundation framework na nagbibigay ng interface para sa pagtatrabaho sa file system ng iOS, macOS at iba pang Apple platform. Pinapayagan nitong lumikha, magbasa, maglipat at magtanggal ng mga file at direktoryo, pati na rin pamahalaan ang metadata at mga karapatan sa pag-access. Sa iOS, lahat ng operasyon ng FileManager ay limitado sa loob ng Sandbox ng app. Ayon sa Apple Developer Documentation (2026), ang FileManager ay thread-safe at maaaring gamitin mula sa mga background thread, ngunit ang lahat ng operasyon sa file system ay dapat isagawa na isinasaalang-alang ang sandbox at mga karapatan sa pag-access ng Security-Scoped Bookmarks.
Mga pangunahing punto
FileManager — isang singleton na klase mula sa Foundation framework na nagbibigay ng pinag-isang API para sa pakikipag-ugnayan sa file system sa lahat ng Apple platform. Ito ay maa-access sa pamamagitan ng FileManager.default o sa pamamagitan ng paglikha ng instance na may custom na delegate.
Ang mga pangunahing kakayahan ng klase ay kinabibilangan ng: pagsuri kung may file (fileExists), paglikha ng mga direktoryo (createDirectory), pagkopya at paglipat (copyItem, moveItem), pagtanggal (removeItem), pagkuha ng mga attribute (attributesOfItem) at nilalaman ng direktoryo (contentsOfDirectory). Ang FileManager ay malapit na nauugnay sa NSData, String at JSONEncoder/Decoder para sa serialization ng data.
Ang FileManager ay thread-safe: ginagarantiyahan ng Apple ang kaligtasan ng pagtawag ng mga method mula sa iba't ibang thread. Gayunpaman, ang mga operasyon sa file system ay maaaring mabagal sa malalaking file, kaya inirerekumenda ng Apple na isagawa ang mga ito sa isang background queue (DispatchQueue.global) at tawagan ang mga method ng FileManagerDelegate para sa pagpapaalam tungkol sa progreso.
let fileManager = FileManager.default
let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = documentsURL.appendingPathComponent("data.plist")
if fileManager.fileExists(atPath: fileURL.path) {
print("File exists at \(fileURL.path)")
}
Bawat iOS app ay may tatlong pangunahing direktoryo na maa-access sa pamamagitan ng FileManager sa loob ng Sandbox: Documents, Library at tmp. Bawat isa ay may kanya-kanyang layunin at mga panuntunan sa pag-backup, na ang pagsunod ay mahalaga para makapasa sa pagsusuri ng App Store.
Documents — para sa data ng user na dapat panatilihin sa pagitan ng mga paglunsad at i-backup sa iCloud. Library — para sa mga file ng app: mga cache (Caches), mga setting (Preferences), mga database (Application Support). tmp — para sa mga pansamantalang file na maaaring tanggalin ng system anumang oras sa pagitan ng mga paglunsad ng app.
| Direktoryo | URL ng FileManager | Backup | Gamit |
|---|---|---|---|
| Documents | .documentDirectory | Oo | Data ng user, mga file, export |
| Library/Caches | .cachesDirectory | Hindi | Cache ng mga larawan, pansamantalang data |
| Library/Preferences | .libraryDirectory + "/Preferences" | Oo | UserDefaults, mga setting ng app |
| Library/Application Support | .applicationSupportDirectory | Oo | Mga database, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Hindi | Mga pansamantalang file ng session |
Panuntunan ng Apple: kung ang isang file ay maaaring maibalik mula sa internet o muling likhain — dapat itong itago sa Caches (walang backup). Kung ang file ay naglalaman ng data ng user — Documents (may backup). Ang maling paglalagay ng mga file ay isa sa mga karaniwang dahilan ng pagtanggi ng app, dahil sinusuri ng Apple ang pagsunod sa Storage & iCloud Backup Guidelines.
FileManager mismo ay hindi nagbibigay ng mga method para sa pagbasa ng nilalaman ng file — para dito ginagamit ang NSData(contentsOf), String(contentsOf) o mga method ng FileHandle. Ang FileManager ay responsable para sa pamamahala ng mga file: pagsuri kung may file, paglipat, pagkopya, pagtanggal.
Para sa pagsulat ng data, ginagamit ang method na createFile(atPath:contents:attributes:) o mataas na antas ng API — data.write(to:), JSONEncoder.encode at PropertyListEncoder. Nagbibigay din ang FileManager ng FileHandle para sa streaming na pagbasa at pagsulat ng malalaking file, na hindi naglo-load ng buong file sa memorya.
struct UserSettings: Codable {
let username: String
let isDarkMode: Bool
let fontSize: Int
}
let settings = UserSettings(
username: "developer",
isDarkMode: true,
fontSize: 16
)
// Isulat ang JSON sa Documents
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(settings)
let url = documentsURL.appendingPathComponent("settings.json")
try data.write(to: url, options: .atomic)
// Basahin ang JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
.decode(UserSettings.self, from: loadedData)
Kapag nagsusulat, gamitin ang options: .atomic — ginagarantiyahan nito na hindi masisira ang file kung magkaroon ng pagkabigo sa pagsulat: ang data ay unang nai-save sa isang pansamantalang file, pagkatapos ay atomikong inililipat sa target na landas. Para sa pagbasa ng malalaking file, gamitin ang FileHandle na may .readingMode at basahin ang data sa mga piraso, kontrolin ang paggamit ng memorya.
FileManager ay nagbibigay ng mga method para sa kumpletong pamamahala ng direktoryo: createDirectory (paglikha ng lahat ng intermediate folder sa pamamagitan ng withIntermediateDirectories), contentsOfDirectory (pagkuha ng listahan ng mga file), enumeratorAt (recursive na paglalakbay) at subpathsOfDirectory (lahat ng landas sa loob ng direktoryo).
Ang method na enumeratorAt ay nagbabalik ng DirectoryEnumerator na nagbibigay-daan sa mahusay na paglalakbay sa malalaking direktoryo nang hindi nilo-load ang buong nilalaman sa memorya. Ito ay sumusuporta sa pag-filter sa pamamagitan ng skipDescendants at nagbibigay ng mga attribute ng bawat elemento nang walang karagdagang query sa file system.
// Recursive na paglalakbay sa direktoryo
if let enumerator = fileManager.enumerator(
at: documentsURL,
includingPropertiesForKeys: [.fileSizeKey, .isDirectoryKey]
) {
for case let fileURL as URL in enumerator {
let attrs = try fileURL.resourceValues(
for: [.fileSizeKey, .isDirectoryKey]
)
if attrs.isDirectory == false {
let size = attrs.fileSize ?? 0
print("File: \(fileURL.lastPathComponent), Size: \(size) bytes")
}
}
}
Para sa pagtanggal ng direktoryo, gamitin ang removeItem(at:). Babala: ang pagtanggal ng direktoryo sa iOS ay hindi na mababawi — ang mga file ay hindi napupunta sa basurahan, tulad ng sa macOS. Bago tanggalin, tiyakin na hindi mo na ginagamit ang mga file mula sa direktoryong ito, at isagawa ang operasyon sa isang background thread, dahil ang pagtanggal ng maraming file ay maaaring makablock sa UI.
FileManager ay nakikipag-ugnayan sa iCloud Drive sa pamamagitan ng method na URLForUbiquityContainerIdentifier, na nagbabalik ng URL ng direktoryo ng iCloud para sa app. Para gumana, kinakailangan na i-enable ang iCloud capability sa proyekto at idagdag ang kaukulang entitlement.
Ang mga file ng iCloud ay awtomatikong nasi-sync, ngunit ang FileManager ay nagbibigay ng mga method para sa manu-manong kontrol: startDownloadingUbiquitousItem ay pumipilit na simulan ang pag-download, evictUbiquitousItem ay nagtatanggal ng lokal na kopya, at urlOfItem(at:) ay nagbabalik ng lokal na URL para sa file ng iCloud. Ang NSMetadataQuery ay ginagamit para sa paghahanap ng mga file sa iCloud.
Kritikal na limitasyon: ang iCloud Drive ay hindi suportado para sa mga file sa direktoryo ng Documents — para lamang sa mga file sa ubiquityContainer. Huwag subukang i-sync ang Documents sa pamamagitan ng iCloud; para dito gamitin ang NSUbiquitousKeyValueStore para sa maliliit na volume ng data o Core Data na may CloudKit para sa mga kumplikadong istraktura.
Ang mga operasyon sa FileManager ay maaaring magastos, lalo na sa mga device na may mabagal na flash memory. Ang mga pangunahing rekomendasyon ng Apple ay kinabibilangan ng pagsasagawa ng lahat ng operasyon sa file sa mga background queue, pag-minimize ng bilang ng mga tawag sa fileExistsAtPath, at paggamit ng caching ng mga resulta.
Ang method na fileExists ay nagsasagawa ng system call na stat(), na medyo mabagal. Kung sinusuri mo kung may file bago ito basahin, mas mainam na subukang basahin ito agad at hawakan ang error — ito ay nagsasagawa ng parehong stat, ngunit inaalis ang dobleng system call. Para sa malawakang pagsusuri, gamitin ang enumeratorAt na may resourceValues.
Para sa pag-optimize ng trabaho na may malalaking volume ng data:
Ang Apple Instruments ay nagbibigay ng template na File Activity para sa profiling ng mga operasyon sa file. Gamitin ito upang matukoy ang mga bottleneck — halimbawa, madalas na pagtawag sa fileExists sa isang loop o mga operasyon sa pagsulat sa main thread. Ang pinakakaraniwang problema sa pagganap ay nauugnay sa sabay-sabay na pagsulat ng malalaking file kapag pinaliit ang app.
Mga madalas itanong
FileManager — isang klase ng Foundation framework para sa pagtatrabaho sa Apple file system. Nagbibigay ng API para sa paglikha, pagbasa, paglipat, pagtanggal ng mga file at direktoryo. Sa iOS, ang trabaho nito ay limitado sa loob ng Sandbox ng app, maliban sa Security-Scoped Bookmarks.
Documents — data ng user na may backup sa iCloud. Library/Caches — mga cache na walang backup. Library/Application Support — mga database. tmp — mga pansamantalang file. App Group Container — para sa pinagsamang data sa pagitan ng mga app ng parehong grupo.
Tawagan ang FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Ang method ay nagbabalik ng URL na may absolute path sa direktoryo ng Documents sa loob ng Sandbox ng kasalukuyang app. Para sa pagsuri kung may file, gamitin ang fileExists(atPath:).
Hindi, ang Sandbox ng iOS ay nagbabawal ng pag-access sa file system ng ibang mga app. Mga exception: App Groups (pinagsamang direktoryo para sa mga app ng parehong developer) at Security-Scoped Bookmarks (access sa mga file sa pamamagitan ng UIDocumentPicker at iCloud Drive).
Gamitin ang opsyong .atomic kapag nagsusulat — ang data ay unang nai-save sa isang pansamantalang file, pagkatapos ay atomikong inililipat sa target na landas. Pinipigilan nito ang pagkasira ng file kung magkaroon ng pagkabigo sa pagsulat. Para sa malalaking data, gamitin ang FileHandle na may pagsulat sa mga piraso ng 1-2 MB.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din