FileManager는 iOS, macOS 및 기타 Apple 플랫폼의 파일 시스템 작업을 위한 인터페이스를 제공하는 Foundation 프레임워크의 클래스입니다. 파일 및 디렉토리 생성, 읽기, 이동 및 삭제는 물론 메타데이터 및 액세스 권한 관리를 할 수 있습니다. iOS에서 모든 FileManager 작업은 앱 Sandbox에 의해 제한됩니다. Apple Developer Documentation (2026)에 따르면 FileManager는 스레드 안전하며 백그라운드 스레드에서 사용할 수 있지만, 모든 파일 시스템 작업은 샌드박스 및 Security-Scoped Bookmarks 액세스 권한을 고려하여 수행해야 합니다.
핵심 사항
FileManager는 모든 Apple 플랫폼에서 파일 시스템과 상호 작용하기 위한 통합 API를 제공하는 Foundation 프레임워크의 싱글톤 클래스입니다. FileManager.default를 통해 또는 사용자 지정 델리게이트로 인스턴스를 생성하여 사용할 수 있습니다.
클래스의 주요 기능에는 파일 존재 확인(fileExists), 디렉토리 생성(createDirectory), 복사 및 이동(copyItem, moveItem), 삭제(removeItem), 속성 가져오기(attributesOfItem) 및 디렉토리 내용 가져오기(contentsOfDirectory)가 포함됩니다. FileManager는 데이터 직렬화를 위해 NSData, String 및 JSONEncoder/Decoder와 밀접하게 관련되어 있습니다.
FileManager는 스레드 안전합니다. 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 앱에는 Sandbox 내에서 FileManager를 통해 액세스할 수 있는 세 가지 주요 디렉토리가 있습니다: Documents, Library 및 tmp. 각각 고유한 목적과 백업 규칙이 있으며 App Store 검토를 통과하기 위해 이를 준수하는 것이 중요합니다.
Documents — 실행 간에 유지되고 iCloud에 백업되어야 하는 사용자 데이터용. Library — 앱 파일용: 캐시(Caches), 설정(Preferences), 데이터베이스(Application Support). tmp — 앱 실행 사이에 시스템이 언제든지 삭제할 수 있는 임시 파일용.
| 디렉토리 | FileManager URL | 백업 | 용도 |
|---|---|---|---|
| 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
)
// Documents에 JSON 쓰기
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을 사용하세요 — 쓰기 실패 시 파일이 손상되지 않도록 보장합니다: 데이터가 먼저 임시 파일에 저장된 후 대상 경로로 원자적으로 이동됩니다. 큰 파일을 읽으려면 .readingMode와 함께 FileHandle을 사용하고 메모리 소비를 제어하면서 데이터를 청크 단위로 읽으세요.
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는 URLForUbiquityContainerIdentifier 메서드를 통해 iCloud Drive와 통합되며, 앱의 iCloud 디렉토리 URL을 반환합니다. 이를 위해서는 프로젝트에서 iCloud 기능을 활성화하고 적절한 entitlement을 추가해야 합니다.
iCloud 파일은 자동으로 동기화되지만 FileManager는 수동 제어를 위한 메서드를 제공합니다: startDownloadingUbiquitousItem은 다운로드를 강제하고, evictUbiquitousItem은 로컬 복사본을 제거하며, urlOfItem(at:)은 iCloud 파일의 로컬 URL을 반환합니다. NSMetadataQuery는 iCloud에서 파일 검색에 사용됩니다.
중요한 제한 사항: iCloud Drive는 Documents 디렉토리의 파일에는 지원되지 않습니다 — ubiquityContainer의 파일에만 해당됩니다. Documents를 iCloud를 통해 동기화하려고 하지 마세요. 소량의 데이터에는 NSUbiquitousKeyValueStore를, 복잡한 구조에는 Core Data with CloudKit을 사용하세요.
FileManager 작업은 특히 느린 플래시 메모리를 가진 기기에서 비용이 많이 들 수 있습니다. Apple의 주요 권장 사항에는 모든 파일 작업을 백그라운드 큐에서 수행, fileExistsAtPath 호출 최소화, 결과 캐싱이 포함됩니다.
fileExists 메서드는 stat() 시스템 호출을 수행하며 상대적으로 느립니다. 읽기 전에 파일 존재를 확인하는 경우 직접 읽기를 시도하고 오류를 처리하는 것이 좋습니다 — 동일한 stat을 수행하지만 이중 시스템 호출을 피할 수 있습니다. 대량 확인의 경우 resourceValues와 함께 enumeratorAt을 사용하세요.
대량 데이터 작업 최적화를 위해:
Apple Instruments는 파일 작업 프로파일링을 위한 File Activity 템플릿을 제공합니다. 이를 사용하여 병목 지점을 식별하세요 — 예를 들어 루프에서 빈번한 fileExists 호출이나 메인 스레드에서의 쓰기 작업입니다. 가장 일반적인 성능 문제는 앱 종료 시 큰 파일의 동기적 쓰기와 관련됩니다.
자주 묻는 질문
FileManager는 Apple 파일 시스템 작업을 위한 Foundation 프레임워크의 클래스입니다. 파일 및 디렉토리 생성, 읽기, 이동, 삭제를 위한 API를 제공합니다. iOS에서는 Security-Scoped Bookmarks를 제외하고 앱 Sandbox 내로 작업이 제한됩니다.
Documents — iCloud 백업이 있는 사용자 데이터. Library/Caches — 백업 없는 캐시. Library/Application Support — 데이터베이스. tmp — 임시 파일. App Group Container — 동일 그룹의 앱 간 공유 데이터용.
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first를 호출하세요. 이 메서드는 현재 앱의 Sandbox 내 Documents 디렉토리의 절대 경로가 포함된 URL을 반환합니다. 존재 확인에는 fileExists(atPath:)를 사용하세요.
아니요, iOS Sandbox는 다른 응용 프로그램의 파일 시스템 액세스를 차단합니다. 예외: App Groups(동일 개발자의 앱 간 공유 디렉토리) 및 Security-Scoped Bookmarks(UIDocumentPicker 및 iCloud Drive를 통한 파일 액세스).
쓰기 시 .atomic 옵션을 사용하세요 — 데이터가 먼저 임시 파일에 저장된 후 대상 경로로 원자적으로 이동됩니다. 이는 쓰기 실패 시 파일 손상을 방지합니다. 큰 데이터의 경우 1-2 MB 청크 쓰기와 함께 FileHandle을 사용하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.