FileManager — nó là gì, làm việc với hệ thống tệp iOS

Tác giả: IT Sectr Đã đăng: 2026-07-09 Thời gian đọc: 9 phút

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à lớp chính của Foundation cho các thao tác hệ thống tệp: đọc, ghi, di chuyển, xóa tệp.
  • Sandbox giới hạn quyền truy cập FileManager chỉ trong các thư mục ứng dụng — Documents, Library, tmp và App Group.
  • API dựa trên URL (fileManager.urls) được ưu tiên hơn dựa trên String (NSHomeDirectory) cho ứng dụng hiện đại.
  • FileManagerDelegate cho phép theo dõi và kiểm soát các thao tác tệp thông qua shouldMoveItemAt và shouldRemoveItemAt.
  • iCloud Drive có sẵn qua FileManager khi ubiquityContainer được bật và các entitlements phù hợp được thiết lập.

FileManager là gì

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.

swift
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)")
}

Các thư mục chính của ứng dụng iOS

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ụcURL FileManagerSao lưuSử dụng
Documents.documentDirectoryDữ liệu người dùng, tệp, xuất khẩu
Library/Caches.cachesDirectoryKhôngBộ nhớ đệm hình ảnh, dữ liệu tạm thời
Library/Preferences.libraryDirectory + "Preferences"UserDefaults, cài đặt ứng dụng
Library/Application Support.applicationSupportDirectoryCơ sở dữ liệu, CoreData, Realm
tmp.tmpDirectory (NSTemporaryDirectory)KhôngTệ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.

Đọc và ghi tệp

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ớ.

swift
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ớ.

Quản lý thư mục

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.

swift
// 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 và iCloud

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.

Hiệu suất FileManager

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:

  • Sử dụng FileHandle để xử lý luồng các tệp lớn
  • Lưu vào bộ nhớ đệm kết quả fileManager.urls cho các thư mục thường dùng
  • Thực hiện các thao tác hàng loạt trên hàng đợi chi tiết, tránh chặn luồng chính
  • Sử dụng CoordinatedFileManager để truy cập an toàn từ nhiều luồng

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 trong iOS là gì?

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.

Những thư mục nào có thể truy cập qua FileManager trong iOS?

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.

Làm thế nào để lấy đường dẫn đến Documents qua FileManager?

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.

Tôi có thể truy cập tệp của ứng dụng khác qua FileManager không?

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).

Làm thế nào để ghi tệp an toàn qua FileManager?

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

  • FileManager là lớp trung tâm của Foundation cho tất cả các thao tác hệ thống tệp trong iOS: từ kiểm tra tồn tại đến duyệt thư mục đệ quy.
  • Documents, Library, tmp — ba thư mục chính của ứng dụng với các quy tắc sao lưu và vòng đời khác nhau.
  • API dựa trên URL được ưu tiên hơn đường dẫn dựa trên String để tương thích với Sandbox và Security-Scoped Bookmarks.
  • FileHandle và xử lý luồng là cách duy nhất để làm việc với tệp lớn mà không tràn bộ nhớ.
  • FileManagerDelegate cho phép kiểm soát các thao tác di chuyển, sao chép và xóa thông qua các phương thức should-.
  • Tích hợp iCloud có sẵn qua ubiquityContainer và NSMetadataQuery để làm việc với tệp đám mây.
  • Hiệu suất của các thao tác tệp rất quan trọng — thực hiện chúng trên hàng đợi nền và giảm thiểu cuộc gọi fileExists.

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.

Thảo luận dự án

Đọc thêm