파일 시스템은 데이터 파일, 앱 및 운영 체제 자체와 관련된 파일의 영구 저장소를 처리한다. 따라서 파일 시스템은 모든 프로세스에서 사용하는 기본 리소스 중 하나이다.
APFS는 macOS, iOS, watchOS 및 tvOS의 기본 파일 시스템이다. APFS는 iOS 10.3 이상 및 macOS High Sierra 이상에 대한 기본 파일 시스템으로 HFS+를 대체한다. macOS는 Supported File Systems 에 설명된대로 다양한 기타 형식을 추가로 지원한다.
기본 형식에 관계없이 장치에 연결된 모든 디스크 (물리적으로 연결되어 있거나 네트워크를 통해 간접적으로 연결됨)는 단일 파일 모음을 만드는 데 공간을 제공한다. 파일 수가 수백만 개일 수 있기 때문에 파일 시스템은 디렉토리를 사용하여 계층 구조를 만든다. 기본 디렉터리 구조는 iOS와 macOS에서 비슷하지만 각 시스템이 앱과 사용자 데이터를 구성하는 방식에는 차이가 있다.
파일 시스템과 상호 작용하는 코드 작성을 시작하기 전에 먼저 파일 시스템의 구성과 코드에 적용되는 규칙에 대해 약간 이해해야 한다. 적절한 보안 권한이 없는 디렉터리에 파일을 쓸 수 없다는 기본 원칙 외에도 앱은 좋은 거주자가 되어 적절한 위치에 파일을 배치해야 한다. 파일을 넣는 정확한 위치는 플랫폼에 따라 다르지만 가장 중요한 목표는 사용자의 파일을 쉽게 검색 할 수 있도록 하고 코드가 내부적으로 사용하는 파일이 사용자의 방해가 되지 않도록하는 것이다.
About the iOS File System
iOS 파일 시스템은 자체적으로 실행되는 앱에 맞춰져 있다. 시스템을 단순하게 유지하기 위해 iOS 장치 사용자는 파일 시스템에 직접 액세스 할 수 없으며 앱은 이 규칙을 따라야한다.
iOS Standard Directories: Where Files Reside
보안상의 이유로 iOS 앱과 파일 시스템의 상호 작용은 앱의 샌드박스 디렉토리 내에 있는 디렉토리로 제한된다. 새 앱을 설치하는 동안 설치 프로그램은 샌드박스 디렉터리 내에 앱에 대한 여러 컨테이너 디렉터리를 만든다. 각 컨테이너 디렉토리에는 특정 역할이 있다. 번들 컨테이너 디렉토리는 앱의 번들을 보유하고 데이터 컨테이너 디렉토리는 앱과 사용자 모두에 대한 데이터를 보유한다. 데이터 컨테이너 디렉터리는 앱이 데이터를 정렬하고 구성하는 데 사용할 수 있는 여러 하위 디렉터리로 더 나뉜다. 또한 앱은 런타임에 추가 컨테이너 디렉토리 (예: iCloud 컨테이너)에 대한 액세스를 요청할 수 있다.
이러한 컨테이너 디렉토리는 파일 시스템에 대한 앱의 기본적인 뷰를 구성한다. 그림 1-1은 앱의 샌드박스 디렉터리를 보여준다.
일반적으로 앱은 컨테이너 디렉토리 외부에서 파일에 액세스하거나 파일을 만드는 것이 금지된다. 이 규칙의 한 가지 예외는 앱이 공개 시스템 인터페이스를 사용하여 사용자의 연락처 또는 음악과 같은 항목에 액세스하는 경우이다. 이러한 경우 시스템 프레임워크는 헬퍼 앱을 사용하여 적절한 데이터 저장소에서 읽거나 수정하는 데 필요한 파일 관련 작업을 처리한다.
하단의 표는 sandbox 디렉토리 내의서 가장 중요한 하위 디렉토리 중 일부를 나열하고 용도를 설명한다. 또한 이 표는 각 하위 디렉토리에 대한 추가 액세스 제한을 설명하고 해당 디렉토리의 콘텐츠가 iTunes 및 iCloud에 의해 백업되는지 여부를 나타낸다.
Directory | Description |
AppName.app | 앱의 번들이다. 이 디렉터리에는 앱과 모든 리소스가 포함되어 있다. 이 디렉토리에 쓰기는 불가능하다. 변조를 방지하기 위해 번들 디렉토리는 설치시 서명된다. 이 디렉토리에 쓰면 서명이 변경되고 앱이 시작되지 않는다. 그러나 앱 번들에 저장된 모든 리소스에 대한 읽기 전용 액세스 권한을 얻을 수 있다. 자세한 내용은 Resource Programming Guide를 참조하시오. 이 디렉토리의 내용은 iTunes 또는 iCloud에 의해 백업되지 않는다. 그러나 iTunes는 App Store에서 구입한 모든 앱의 초기 동기화를 수행한다. |
Documents/ | 이 디렉토리를 사용하여 사용자 생성 컨텐츠를 저장하시오. 이 디렉토리의 내용은 파일 공유를 통해 사용자에게 제공 될 수 있다. 따라서 이 디렉토리에는 사용자에게 노출 할 수 있는 파일만 포함되어야 한다. 이 디렉토리의 내용은 iTunes 및 iCloud에 의해 백업된다. |
Documents/Inbox | 이 디렉터리를 사용하여 앱이 외부 엔터티에서 열도록 요청한 파일에 액세스한다. 특히 메일 프로그램은 앱과 관련된 이메일 첨부 파일을 이 디렉토리에 저장한다. 문서 상호 작용 컨트롤러는 파일을 저장할 수도 있다. 앱은 이 디렉터리의 파일을 읽고 삭제할 수 있지만 새 파일을 만들거나 기존 파일에 쓸 수는 없다. 사용자가 이 디렉터리에서 파일을 편집하려고 하면 변경하기 전에 앱에서 해당 파일을 디렉터리 밖으로 자동으로 이동해야 한다. 이 디렉토리의 내용은 iTunes 및 iCloud에 의해 백업된다. |
Library/ | 사용자 데이터 파일이 아닌 모든 파일의 최상위 디렉토리이다. 일반적으로 여러 표준 하위 디렉토리 중 하나에 파일을 넣는다. iOS 앱은 일반적으로 애플리케이션 지원 및 캐시 하위 디렉토리를 사용한다. 그러나 사용자 지정 하위 디렉터리를 만들 수 있다. 사용자에게 노출하지 않으려는 파일에는 라이브러리 하위 디렉토리를 사용한다. 앱은 사용자 데이터 파일에 이러한 디렉터리를 사용해서는 안된다. Library 디렉토리의 내용 (Caches 하위 디렉토리 제외)은 iTunes 및 iCloud에 의해 백업된다. 라이브러리 디렉토리 및 일반적으로 사용되는 하위 디렉토리에 대한 추가 정보는 The Library Directory Stores App-Specific Files을 참조하시오. |
tmp/ | 이 디렉토리를 사용하여 앱 실행 사이에 지속될 필요가 없는 임시 파일을 작성하시오. 앱은 더 이상 필요하지 않은 파일을 이 디렉토리에서 제거해야 한다. 앱이 실행되고 있지 않을 때 시스템에서 이 디렉터리를 제거 할 수 있다. 이 디렉토리의 내용은 iTunes 또는 iCloud에 의해 백업되지 않는다. |
iOS 앱은 문서, 라이브러리 및 tmp 디렉토리에 추가 디렉토리를 만들 수 있다. 이러한 위치에서 파일을 더 잘 구성하기 위해 이 작업을 수행 할 수 있다.
iOS 앱에서 이전 디렉토리에 대한 참조를 가져 오는 방법에 대한 정보는 Locating Items in the Standard Directories를 참조하시오. 파일을 배치 할 위치에 대한 팁은 Where You Should Put Your App’s Files를 참조하시오.
Where You Should Put Your App’s Files
iOS 장치의 동기화 및 백업 프로세스에 시간이 오래 걸리지 않도록 하려면 파일을 저장할 위치를 선택하시오. 대용량 파일을 저장하는 앱은 iTunes 또는 iCloud에 백업하는 과정을 느리게 할 수 있다. 또한 이러한 앱은 사용자의 사용 가능한 저장 공간을 많이 소모 할 수 있으며, 이로 인해 사용자가 앱을 삭제하거나 해당 앱의 데이터를 iCloud에 백업하지 못하도록 할 수 있다. 따라서 다음 지침에 따라 앱 데이터를 저장해야 한다.
- Documents/에 사용자 데이터를 넣는다. 사용자 데이터에는 일반적으로 사용자에게 노출하려는 모든 파일 (사용자가 생성, 가져 오기, 삭제 또는 편집하기를 원하는 모든 파일)이 포함된다. 드로잉 앱의 경우 사용자 데이터에는 사용자가 만들 수있는 모든 그래픽 파일이 포함된다. 텍스트 편집기의 경우 텍스트 파일이 포함된다. 비디오 및 오디오 앱에는 사용자가 나중에 보거나 들을 수 있도록 다운로드 한 파일도 포함될 수 있다.
- 앱에서 만든 지원 파일을 Library/Application support/ 디렉토리에 넣는다. 일반적으로 이 디렉터리에는 앱이 실행하는 데 사용하지만 사용자에게 숨겨져 있어야 하는 파일이 포함된다. 이 디렉토리에는 데이터 파일, 구성 파일, 템플릿 및 App Bundle에서 로드 된 리소스의 수정 된 버전도 포함될 수 있다.
- Documents/ 및 Application Support/의 파일은 기본적으로 백업된다. NSURLIsExcludedFromBackupKey 키를 사용하여 - [NSURL setResourceValue:forKey:error:] 를 호출하여 백업에서 파일을 제외 할 수 있다. 다시 생성하거나 다운로드 할 수 있는 모든 파일은 백업에서 제외되어야 한다. 이것은 대용량 미디어 파일에 특히 중요하다. 응용 프로그램에서 비디오 또는 오디오 파일을 다운로드하는 경우 해당 파일이 백업에 포함되지 않았는지 확인하시오.
- tmp/ 디렉토리에 임시 데이터를 넣으시오. 임시 데이터는 장기간 지속 할 필요가 없는 데이터로 구성된다. 작업이 끝나면 해당 파일이 사용자 기기의 공간을 계속 사용하지 않도록 삭제해야 한다. 시스템은 앱이 실행되지 않을 때 주기적으로 이러한 파일을 제거한다. 따라서 앱이 종료 된 후에도 이러한 파일이 유지되는 것을 신뢰할 수 없다.
- Library/Caches/ 디렉토리에 데이터 캐시 파일을 넣는다. 캐시 데이터는 임시 데이터보다 오래 지속되어야하지만 지원 파일 만큼 오래 유지되어야 하는 모든 데이터에 사용할 수 있다. 일반적으로 애플리케이션은 제대로 작동하기 위해 캐시 데이터가 필요하지 않지만 성능 향상을 위해 캐시 데이터를 사용할 수 있다. 캐시 데이터의 예로는 데이터베이스 캐시 파일과 다운로드 가능한 일시적인 콘텐츠가 있다. 시스템은 디스크 공간을 확보하기 위해 Caches/ 디렉토리를 삭제할 수 있으므로 앱이 필요에 따라 이러한 파일을 다시 생성하거나 다운로드 할 수 있어야 한다.
How the System Identifies the Type of Content in a File
파일의 콘텐츠 타입을 식별하는 두 가지 기본적인 기술이 있다.
- Uniform Type Identifiers (UTIs)
- Filename extensions
uniform type identifier는 "타입"이 있는 것으로 간주되는 엔티티의 클래스를 고유하게 식별하는 문자열이다. UTI는 모든 앱과 서비스가 인식하고 신뢰할 수 있는 데이터에 대한 일관된 식별자를 제공한다. 또한 파일 및 디렉토리 뿐만 아니라 모든 유형의 데이터를 나타내는 데 사용할 수 있기 때문에 대부분의 다른 기술보다 더 유연하다. UTI의 예는 다음과 같다.
- public.text - 텍스트 데이터를 식별하는 공용 유형이다.
- public.jpeg - JPEG 이미지 데이터를 식별하는 공용 유형이다.
- com.apple.bundle - 번들 디렉토리를 식별하는 Apple 유형이다.
- com.apple.application-bundle - 번들 앱을 식별하는 Apple 유형이다.
파일 유형을 지정하는 데 UTI 기반 인터페이스를 사용할 수 있을 때 마다 다른 인터페이스보다 해당 인터페이스를 선호해야 한다. 많은 macOS 인터페이스를 사용하여 작업하려는 파일 또는 디렉토리에 해당하는 UTI를 지정할 수 있다. 예를 들어 열기 패널에서 UTI를 파일 필터로 사용하고 사용자가 선택하는 파일 타입을 앱에서 처리 할 수있는 파일로 제한 할 수 있다. NSDocument, NSPasteboard 및 NSImage를 포함한 여러 AppKit 클래스는 UTI를 지원한다. iOS에서 UTI는 pasteboard types을 지정하는 데만 사용된다.
시스템이 주어진 파일의 UTI를 결정하는 한 가지 방법은 파일 이름 확장자를 확인하는 것이다. 파일 이름 확장자는 파일 끝에 추가되고 마침표로 기본 파일 이름과 구분되는 문자열이다. 각 고유 문자열은 특정 유형의 파일을 식별한다. 예를 들어 .strings 확장자는 지역화 가능한 문자열 데이터가 있는 리소스 파일을 식별하고 .png 확장자는 휴대용 네트워크 그래픽 형식의 이미지 데이터가 있는 파일을 식별한다.
참고
마침표 문자는 macOS 및 iOS 파일 이름에서 유효한 문자이므로 파일 이름에서 마지막 마침표 뒤의 문자 만 파일 이름 확장자의 일부로 간주된다. 마지막 마침표의 왼쪽에 있는 모든 것은 파일 이름 자체의 일부로 간주된다.
앱에서 맞춤 파일 형식을 정의하는 경우 해당 형식 및 관련 파일 이름 확장자를 앱의 Info.plist 파일에 등록해야 한다. CFBundleDocumentTypes 키는 앱이 인식하고 열 수 있는 파일 형식을 지정한다. 사용자 정의 파일 형식에 대한 항목에는 파일 내용에 해당하는 파일 이름 확장자와 UTI가 모두 포함되어야 한다. 시스템은 해당 정보를 사용하여 적절한 유형의 파일을 앱으로 보낸다.
UTI 및 UTI 사용 방법에 대한 자세한 정보는 Uniform Type Identifiers Overview를 참조하시오. CFBundleDocumentTypes 키에 대한 자세한 내용은 Information Property List Key Reference를 참조하시오.
[원문]
File System Basics
File System Basics A file system handles the persistent storage of data files, apps, and the files associated with the operating system itself. Therefore, the file system is one of the fundamental resources used by all processes. APFS is the default file s
developer.apple.com
'프로그래밍 > iOS' 카테고리의 다른 글
[UIKit] TableView section header 간격 문제 해결 (0) | 2022.12.24 |
---|---|
[SwiftUI] UIViewRepresentable 란 무엇인가? (0) | 2022.12.20 |
File System Programming Guide (1) - Introduction (0) | 2021.01.07 |
FileManager (0) | 2021.01.07 |
Filling a Table with Data (0) | 2021.01.05 |