FileManager là một lớp từ framework Foundation cung cấp giao diện để làm việc với hệ thống tệp trên iOS, macOS và các nền tảng Apple khác. Nó cho phép tạo, đọc, di chuyển và xóa tệp và thư mục, cũng như quản lý siêu dữ liệu và quyền truy cập. Trong iOS, tất cả các thao tác FileManager bị giới hạn bởi Sandbox ứng dụng. Theo Tài liệu Nhà phát triển Apple (2026), FileManager an toàn cho luồng và có thể được sử dụng từ các luồng nền, nhưng tất cả các thao tác hệ thống tệp phải được thực hiện có xét đến sandbox và quyền truy cập Security-Scoped Bookmarks.
Những Điểm Chính
FileManager là một lớp singleton từ framework Foundation cung cấp API thống nhất để tương tác với hệ thống tệp trên tất cả các nền tảng Apple. Nó có sẵn qua FileManager.default hoặc bằng cách tạo một thể hiện với ủy quyền tùy chỉnh.
Các khả năng chính của lớp bao gồm: kiểm tra sự tồn tại của tệp (fileExists), tạo thư mục (createDirectory), sao chép và di chuyển (copyItem, moveItem), xóa (removeItem), lấy thuộc tính (attributesOfItem) và nội dung thư mục (contentsOfDirectory). FileManager liên quan chặt chẽ với NSData, String và JSONEncoder/Decoder để tuần tự hóa dữ liệu.
FileManager an toàn cho luồng: Apple đảm bảo các cuộc gọi phương thức an toàn từ các luồng khác nhau. Tuy nhiên, các thao tác hệ thống tệp có thể chậm trên các tệp lớn, vì vậy Apple khuyến nghị thực hiện chúng trên hàng đợi nền (DispatchQueue.global) và gọi các phương thức FileManagerDelegate để báo cáo tiến trình.
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)")
}
Mỗi ứng dụng iOS có ba thư mục chính có thể truy cập qua FileManager trong Sandbox: Documents, Library và tmp. Mỗi thư mục có mục đích và quy tắc sao lưu riêng cần tuân thủ để vượt qua quá trình xét duyệt App Store.
Documents — cho dữ liệu người dùng cần được giữ lại giữa các lần khởi động và sao lưu vào iCloud. Library — cho các tệp ứng dụng: bộ nhớ đệm (Caches), cài đặt (Preferences), cơ sở dữ liệu (Application Support). tmp — cho các tệp tạm thời có thể bị hệ thống xóa bất kỳ lúc nào giữa các lần khởi động ứng dụng.
| Thư mục | URL FileManager | Sao lưu | Sử dụng |
|---|---|---|---|
| Documents | .documentDirectory | Có | Dữ liệu người dùng, tệp, xuất khẩu |
| Library/Caches | .cachesDirectory | Không | Bộ nhớ đệm hình ảnh, dữ liệu tạm thời |
| Library/Preferences | .libraryDirectory + "Preferences" | Có | UserDefaults, cài đặt ứng dụng |
| Library/Application Support | .applicationSupportDirectory | Có | Cơ sở dữ liệu, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Không | Tệp phiên tạm thời |
Quy tắc Apple: nếu tệp có thể được khôi phục từ internet hoặc tạo lại — nó nên được lưu trữ trong Caches (không sao lưu). Nếu tệp chứa dữ liệu người dùng — Documents (có sao lưu). Đặt tệp sai vị trí là một trong những nguyên nhân phổ biến khiến ứng dụng bị từ chối, vì Apple kiểm tra việc tuân thủ Hướng dẫn Lưu trữ và Sao lưu iCloud.
FileManager tự nó không cung cấp phương thức đọc nội dung tệp — để làm điều đó hãy sử dụng NSData(contentsOf), String(contentsOf) hoặc các phương thức FileHandle. FileManager chịu trách nhiệm quản lý tệp: kiểm tra tồn tại, di chuyển, sao chép, xóa.
Để ghi dữ liệu, sử dụng phương thức createFile(atPath:contents:attributes:) hoặc API cấp cao — data.write(to:), JSONEncoder.encode và PropertyListEncoder. FileManager cũng cung cấp FileHandle để đọc và ghi luồng các tệp lớn, không tải toàn bộ tệp vào bộ nhớ.
struct UserSettings: Codable {
let username: String
let isDarkMode: Bool
let fontSize: Int
}
let settings = UserSettings(
username: "developer",
isDarkMode: true,
fontSize: 16
)
// Ghi JSON vào 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)
// Đọc JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
.decode(UserSettings.self, from: loadedData)
Khi ghi, sử dụng options: .atomic — điều này đảm bảo tệp sẽ không bị hỏng nếu ghi thất bại: dữ liệu được lưu vào tệp tạm thời trước, sau đó được di chuyển nguyên tử đến đường dẫn đích. Để đọc tệp lớn, sử dụng FileHandle với .readingMode và đọc dữ liệu theo khối, kiểm soát mức tiêu thụ bộ nhớ.
FileManager cung cấp các phương thức để quản lý thư mục đầy đủ: createDirectory (tạo tất cả thư mục trung gian qua withIntermediateDirectories), contentsOfDirectory (lấy danh sách tệp), enumeratorAt (duyệt đệ quy) và subpathsOfDirectory (tất cả đường dẫn trong một thư mục).
Phương thức enumeratorAt trả về DirectoryEnumerator, cho phép duyệt hiệu quả các thư mục lớn mà không tải toàn bộ nội dung vào bộ nhớ. Nó hỗ trợ lọc qua skipDescendants và cung cấp thuộc tính của từng mục mà không cần truy vấn hệ thống tệp bổ sung.
// Duyệt thư mục đệ quy
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")
}
}
}
Để xóa thư mục, sử dụng removeItem(at:). Cảnh báo: xóa thư mục trong iOS là không thể đảo ngược — tệp không vào thùng rác như trên macOS. Trước khi xóa, hãy đảm bảo bạn không cần các tệp từ thư mục đó nữa và thực hiện thao tác trên luồng nền, vì xóa nhiều tệp có thể chặn giao diện người dùng.
FileManager tích hợp với iCloud Drive thông qua phương thức URLForUbiquityContainerIdentifier, trả về URL thư mục iCloud cho ứng dụng. Điều này yêu cầu bật khả năng iCloud trong dự án và thêm entitlement phù hợp.
Các tệp iCloud đồng bộ tự động, nhưng FileManager cung cấp các phương thức để kiểm soát thủ công: startDownloadingUbiquitousItem buộc tải xuống, evictUbiquitousItem xóa bản sao cục bộ và urlOfItem(at:) trả về URL cục bộ cho tệp iCloud. NSMetadataQuery được sử dụng để tìm kiếm tệp trong iCloud.
Giới hạn quan trọng: iCloud Drive không được hỗ trợ cho các tệp trong thư mục Documents — chỉ cho các tệp trong ubiquityContainer. Đừng cố đồng bộ Documents qua iCloud; thay vào đó hãy sử dụng NSUbiquitousKeyValueStore cho lượng dữ liệu nhỏ hoặc Core Data với CloudKit cho cấu trúc phức tạp.
Các thao tác với FileManager có thể tốn kém, đặc biệt trên các thiết bị có bộ nhớ flash chậm. Các khuyến nghị chính của Apple bao gồm thực hiện tất cả thao tác tệp trên hàng đợi nền, giảm thiểu số lượng cuộc gọi fileExistsAtPath và lưu kết quả vào bộ nhớ đệm.
Phương thức fileExists thực hiện cuộc gọi hệ thống stat(), tương đối chậm. Nếu bạn kiểm tra sự tồn tại của tệp trước khi đọc, tốt hơn nên cố gắng đọc trực tiếp và xử lý lỗi — điều này thực hiện cùng stat nhưng tránh cuộc gọi hệ thống kép. Để kiểm tra hàng loạt, sử dụng enumeratorAt với resourceValues.
Để tối ưu hóa làm việc với khối lượng dữ liệu lớn:
Apple Instruments cung cấp mẫu File Activity để phân tích thao tác tệp. Sử dụng nó để xác định điểm nghẽn — ví dụ: các cuộc gọi fileExists thường xuyên trong vòng lặp hoặc thao tác ghi trên luồng chính. Các vấn đề hiệu suất phổ biến nhất liên quan đến việc ghi đồng bộ các tệp lớn khi ứng dụng bị tạm dừng.
Các Câu Hỏi Thường Gặp
FileManager là một lớp của framework Foundation để làm việc với hệ thống tệp Apple. Nó cung cấp API để tạo, đọc, di chuyển và xóa tệp và thư mục. Trong iOS, hoạt động của nó bị giới hạn trong Sandbox ứng dụng, ngoại trừ Security-Scoped Bookmarks.
Documents — dữ liệu người dùng có sao lưu iCloud. Library/Caches — bộ nhớ đệm không sao lưu. Library/Application Support — cơ sở dữ liệu. tmp — tệp tạm thời. App Group Container — cho dữ liệu chia sẻ giữa các ứng dụng cùng nhóm.
Gọi FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Phương thức trả về URL với đường dẫn tuyệt đối đến thư mục Documents trong Sandbox ứng dụng hiện tại. Sử dụng fileExists(atPath:) để kiểm tra sự tồn tại.
Không, Sandbox iOS ngăn truy cập vào hệ thống tệp của ứng dụng khác. Ngoại lệ: App Groups (thư mục chia sẻ cho ứng dụng cùng nhà phát triển) và Security-Scoped Bookmarks (truy cập tệp qua UIDocumentPicker và iCloud Drive).
Sử dụng tùy chọn .atomic khi ghi — dữ liệu được lưu vào tệp tạm thời trước, sau đó được di chuyển nguyên tử đến đường dẫn đích. Điều này ngăn hỏng tệp nếu ghi thất bại. Đối với dữ liệu lớn, sử dụng FileHandle với ghi theo khối 1-2 MB.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm