FileManager — είναι μια κλάση από το Foundation framework που παρέχει διεπαφή για εργασία με το σύστημα αρχείων iOS, macOS και άλλων πλατφορμών Apple. Επιτρέπει τη δημιουργία, ανάγνωση, μετακίνηση και διαγραφή αρχείων και καταλόγων, καθώς και τη διαχείριση μεταδεδομένων και δικαιωμάτων πρόσβασης. Στο iOS, όλες οι λειτουργίες του FileManager περιορίζονται από το Sandbox της εφαρμογής. Σύμφωνα με το Apple Developer Documentation (2026), το FileManager είναι thread-safe και μπορεί να χρησιμοποιηθεί από νήματα παρασκηνίου, αλλά όλες οι λειτουργίες με το σύστημα αρχείων πρέπει να εκτελούνται λαμβάνοντας υπόψη το sandbox και τα δικαιώματα πρόσβασης Security-Scoped Bookmarks.
Κύρια σημεία
FileManager — μια κλάση singleton από το Foundation framework που παρέχει ενοποιημένο API για αλληλεπίδραση με το σύστημα αρχείων σε όλες τις πλατφόρμες Apple. Είναι προσβάσιμο μέσω FileManager.default ή με δημιουργία μιας παρουσίας με προσαρμοσμένο εκπρόσωπο.
Οι κύριες δυνατότητες της κλάσης περιλαμβάνουν: έλεγχο ύπαρξης αρχείου (fileExists), δημιουργία καταλόγων (createDirectory), αντιγραφή και μετακίνηση (copyItem, moveItem), διαγραφή (removeItem), λήψη χαρακτηριστικών (attributesOfItem) και περιεχομένων καταλόγων (contentsOfDirectory). Το FileManager συνδέεται στενά με τα NSData, String και JSONEncoder/Decoder για σειριοποίηση δεδομένων.
Το FileManager είναι thread-safe: η Apple εγγυάται την ασφάλεια κλήσης μεθόδων από διαφορετικά νήματα. Ωστόσο, οι λειτουργίες συστήματος αρχείων μπορεί να είναι αργές σε μεγάλα αρχεία, γι' αυτό η Apple συνιστά την εκτέλεσή τους σε ουρά παρασκηνίου (DispatchQueue.global) και την κλήση μεθόδων FileManagerDelegate για ενημέρωση σχετικά με την πρόοδο.
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)")
}
Κάθε εφαρμογή iOS έχει τρεις κύριους καταλόγους προσβάσιμους μέσω FileManager εντός Sandbox: Documents, Library και tmp. Κάθε ένας έχει τον δικό του σκοπό και κανόνες δημιουργίας αντιγράφων ασφαλείας, η τήρηση των οποίων είναι κρίσιμη για την έγκριση από το App Store.
Documents — για δεδομένα χρήστη που πρέπει να διατηρούνται μεταξύ εκκινήσεων και να δημιουργούνται αντίγραφα ασφαλείας στο iCloud. Library — για αρχεία εφαρμογής: προσωρινή μνήμη (Caches), ρυθμίσεις (Preferences), βάσεις δεδομένων (Application Support). tmp — για προσωρινά αρχεία που μπορούν να διαγραφούν από το σύστημα ανά πάσα στιγμή μεταξύ εκκινήσεων της εφαρμογής.
| Κατάλογος | URL FileManager | Αντίγραφο ασφαλείας | Χρήση |
|---|---|---|---|
| Documents | .documentDirectory | Ναι | Δεδομένα χρήστη, αρχεία, εξαγωγή |
| Library/Caches | .cachesDirectory | Όχι | Προσωρινή μνήμη εικόνων, προσωρινά δεδομένα |
| Library/Preferences | .libraryDirectory + "/Preferences" | Ναι | UserDefaults, ρυθμίσεις εφαρμογής |
| Library/Application Support | .applicationSupportDirectory | Ναι | Βάσεις δεδομένων, CoreData, Realm |
| tmp | .tmpDirectory (NSTemporaryDirectory) | Όχι | Προσωρινά αρχεία συνεδρίας |
Κανόνας Apple: εάν ένα αρχείο μπορεί να αποκατασταθεί από το διαδίκτυο ή να δημιουργηθεί ξανά — πρέπει να αποθηκεύεται στο Caches (χωρίς αντίγραφο ασφαλείας). Εάν το αρχείο περιέχει δεδομένα χρήστη — Documents (με αντίγραφο ασφαλείας). Η λανθασμένη τοποθέτηση αρχείων είναι μια από τις συχνές αιτίες απόρριψης της εφαρμογής, καθώς η Apple ελέγχει τη συμμόρφωση με τις οδηγίες Storage & iCloud Backup Guidelines.
FileManager το ίδιο δεν παρέχει μεθόδους για ανάγνωση περιεχομένου αρχείων — γι' αυτό χρησιμοποιούνται NSData(contentsOf), String(contentsOf) ή μέθοδοι FileHandle. Το FileManager είναι υπεύθυνο για τη διαχείριση αρχείων: έλεγχο ύπαρξης, μετακίνηση, αντιγραφή, διαγραφή.
Για εγγραφή δεδομένων χρησιμοποιείται η μέθοδος createFile(atPath:contents:attributes:) ή API υψηλού επιπέδου — data.write(to:), JSONEncoder.encode και PropertyListEncoder. Το FileManager παρέχει επίσης FileHandle για ροή ανάγνωσης και εγγραφής μεγάλων αρχείων, που δεν φορτώνει ολόκληρο το αρχείο στη μνήμη.
struct UserSettings: Codable {
let username: String
let isDarkMode: Bool
let fontSize: Int
}
let settings = UserSettings(
username: "developer",
isDarkMode: true,
fontSize: 16
)
// Εγγραφή JSON στα 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)
// Ανάγνωση JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
.decode(UserSettings.self, from: loadedData)
Κατά την εγγραφή, χρησιμοποιήστε options: .atomic — αυτό εγγυάται ότι το αρχείο δεν θα καταστραφεί σε περίπτωση αποτυχίας εγγραφής: τα δεδομένα αποθηκεύονται πρώτα σε ένα προσωρινό αρχείο και στη συνέχεια μετακινούνται ατομικά στη διαδρομή προορισμού. Για ανάγνωση μεγάλων αρχείων, χρησιμοποιήστε FileHandle με .readingMode και διαβάστε δεδομένα σε τμήματα, ελέγχοντας την κατανάλωση μνήμης.
FileManager παρέχει μεθόδους για πλήρη διαχείριση καταλόγων: createDirectory (δημιουργία όλων των ενδιάμεσων φακέλων μέσω withIntermediateDirectories), contentsOfDirectory (λήψη λίστας αρχείων), enumeratorAt (αναδρομική διάσχιση) και subpathsOfDirectory (όλες οι διαδρομές εντός καταλόγου).
Η μέθοδος enumeratorAt επιστρέφει ένα DirectoryEnumerator που επιτρέπει αποτελεσματική διάσχιση μεγάλων καταλόγων χωρίς φόρτωση ολόκληρου του περιεχομένου στη μνήμη. Υποστηρίζει φιλτράρισμα μέσω skipDescendants και παρέχει χαρακτηριστικά κάθε στοιχείου χωρίς πρόσθετο ερώτημα στο σύστημα αρχείων.
// Αναδρομική διάσχιση καταλόγου
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")
}
}
}
Για διαγραφή καταλόγου, χρησιμοποιήστε removeItem(at:). Προσοχή: η διαγραφή καταλόγου στο iOS είναι μη αναστρέψιμη — τα αρχεία δεν πηγαίνουν στον κάδο ανακύκλωσης, όπως στο macOS. Πριν από τη διαγραφή, βεβαιωθείτε ότι δεν χρησιμοποιείτε πλέον αρχεία από αυτόν τον κατάλογο και εκτελέστε τη λειτουργία σε νήμα παρασκηνίου, καθώς η διαγραφή πολλών αρχείων μπορεί να μπλοκάρει το UI.
FileManager ενσωματώνεται με το iCloud Drive μέσω της μεθόδου URLForUbiquityContainerIdentifier, η οποία επιστρέφει το URL του καταλόγου iCloud για την εφαρμογή. Για λειτουργία απαιτείται ενεργοποίηση του iCloud capability στο έργο και προσθήκη του αντίστοιχου entitlement.
Τα αρχεία iCloud συγχρονίζονται αυτόματα, αλλά το FileManager παρέχει μεθόδους για χειροκίνητο έλεγχο: η startDownloadingUbiquitousItem ξεκινά αναγκαστικά τη λήψη, η evictUbiquitousItem διαγράφει το τοπικό αντίγραφο και η urlOfItem(at:) επιστρέφει το τοπικό URL για το αρχείο iCloud. Το NSMetadataQuery χρησιμοποιείται για αναζήτηση αρχείων στο iCloud.
Κρίσιμος περιορισμός: το iCloud Drive δεν υποστηρίζεται για αρχεία στον κατάλογο Documents — μόνο για αρχεία στο ubiquityContainer. Μην επιχειρήσετε να συγχρονίσετε τα Documents μέσω iCloud· γι' αυτό χρησιμοποιήστε NSUbiquitousKeyValueStore για μικρούς όγκους δεδομένων ή Core Data με CloudKit για πολύπλοκες δομές.
Οι λειτουργίες με FileManager μπορεί να είναι δαπανηρές, ειδικά σε συσκευές με αργή μνήμη flash. Οι κύριες συστάσεις της Apple περιλαμβάνουν εκτέλεση όλων των λειτουργιών αρχείων σε ουρές παρασκηνίου, ελαχιστοποίηση του αριθμού κλήσεων fileExistsAtPath και χρήση προσωρινής αποθήκευσης αποτελεσμάτων.
Η μέθοδος fileExists εκτελεί μια κλήση συστήματος stat(), η οποία είναι σχετικά αργή. Εάν ελέγχετε την ύπαρξη ενός αρχείου πριν το διαβάσετε, είναι καλύτερο να δοκιμάσετε αμέσως να το διαβάσετε και να χειριστείτε το σφάλμα — αυτό εκτελεί το ίδιο stat, αλλά εξαλείφει μια διπλή κλήση συστήματος. Για μαζικούς ελέγχους, χρησιμοποιήστε enumeratorAt με resourceValues.
Για βελτιστοποίηση εργασίας με μεγάλους όγκους δεδομένων:
Το Apple Instruments παρέχει το πρότυπο File Activity για προφίλ λειτουργιών αρχείων. Χρησιμοποιήστε το για τον εντοπισμό σημείων συμφόρησης — για παράδειγμα, συχνές κλήσεις fileExists σε έναν βρόχο ή λειτουργίες εγγραφής στο main thread. Τα πιο συνηθισμένα προβλήματα απόδοσης σχετίζονται με σύγχρονη εγγραφή μεγάλων αρχείων κατά την ελαχιστοποίηση της εφαρμογής.
Συχνές ερωτήσεις
FileManager — κλάση του Foundation framework για εργασία με το σύστημα αρχείων Apple. Παρέχει API για δημιουργία, ανάγνωση, μετακίνηση, διαγραφή αρχείων και καταλόγων. Στο iOS, η λειτουργία του περιορίζεται από το Sandbox της εφαρμογής, με εξαίρεση τα Security-Scoped Bookmarks.
Documents — δεδομένα χρήστη με αντίγραφο ασφαλείας στο iCloud. Library/Caches — προσωρινή μνήμη χωρίς αντίγραφο ασφαλείας. Library/Application Support — βάσεις δεδομένων. tmp — προσωρινά αρχεία. App Group Container — για κοινόχρηστα δεδομένα μεταξύ εφαρμογών της ίδιας ομάδας.
Καλέστε FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. Η μέθοδος επιστρέφει ένα URL με απόλυτη διαδρομή προς τον κατάλογο Documents εντός του Sandbox της τρέχουσας εφαρμογής. Για έλεγχο ύπαρξης, χρησιμοποιήστε fileExists(atPath:).
Όχι, το Sandbox του iOS απαγορεύει την πρόσβαση στο σύστημα αρχείων άλλων εφαρμογών. Εξαιρέσεις: App Groups (κοινόχρηστος κατάλογος για εφαρμογές του ίδιου προγραμματιστή) και Security-Scoped Bookmarks (πρόσβαση σε αρχεία μέσω UIDocumentPicker και iCloud Drive).
Χρησιμοποιήστε την επιλογή .atomic κατά την εγγραφή — τα δεδομένα αποθηκεύονται πρώτα σε ένα προσωρινό αρχείο και στη συνέχεια μετακινούνται ατομικά στη διαδρομή προορισμού. Αυτό αποτρέπει την καταστροφή του αρχείου σε περίπτωση αποτυχίας εγγραφής. Για μεγάλα δεδομένα, χρησιμοποιήστε FileHandle με εγγραφή σε τμήματα 1-2 MB.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης