[iOS] 파일시스템(File System)

728x90

 

디렉토리구조에 대해 알아보겠습니다.

 

파일 디렉토리 구성

 

iOS Data Storage Guidelines

  • 파일 접근 시, String대신 URL사용 권장
  • 디스크에 파일을 읽고 쓰는것이 컴퓨터의 가장 느린 작업 중 하나.
  • 메모리에 파일 캐싱은 항상 빠른 속도를 보장하지 않는다. 왜냐하면 메모리 사용량 증가로 또 다른 성능이 악화될 수 있고, 시스템 자체 캐시와 중복 가능성이 있기 때문입니다.

 

<번들 디렉토리>

  • 파일 시스템 내 하나의 디렉토리
  • 실행가능한 파일, info.plist, 각종 Resources(이미지, 사운드, strings등)등을 할때 그룹화
let bundlePath = Bundle.main.bundlePath
print("Path:",bundlePath, "\n")

// 출력
Path: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Bundle/Application/E3E2CDB9-47E0-4B94-BC81-F48996151668/BasicFileSystem.app

 

<데이터 컨테이너 홈 디렉토리>

  • Data Container 홈 디렉토리 = NSHomeDirectory()
  • 기본 디렉토리 = Documents, Library, temp
let homePath = NSHomeDirectory()
print("Home Directory:", homePath, "\n")

// 출력
Home Directory: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E

 

<데이터 컨테이터 -> 도큐먼트 폴더>

  • 유저가 앱을 통해 생성한 문서나 데이터, 또는 외부 앱을 통해서 전송한 음악, pdf등의 컨텐츠를 저장하는 곳
  • 유저에 의해 삭제되거나 내용이 변경되어도 무방하고 유저가 다루는 컨텐츠와 관련이 있는 파일들만 저장.
  • 설정에 따라 유저가 직접 파일 추가 및 삭제 가능

        -> info.plist에서 UIFileSharingEnabled = YES로 설정

 

let documentPath1 = NSHomeDirectory() + "/Documents"
print("DocumentPath1:", documentPath1, "\n")
        
let documentPath2 = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)[0]
print("DocumentPath2:", documentPath2, "\n")
        
let documentPath3 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
print("DocumentPath3:", documentPath3, "\n")

// 출력
DocumentPath1: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Documents

DocumentPath2: file:///Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Documents/

DocumentPath3: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Documents

 

 

<데이터 컨테이터 -> 도큐먼트 폴더 -> Inbox>

  • 타 앱을 통해 전송받은 파일이 저장되는 디렉토리 ex) 메일 앱 첨부파일 등
  • 파일을 읽거나 삭제할 수 있지만, 새 파일을 추가하거나 기존 파일 수정 불가
  • 타 앱에서 받은 파일들은 덮어쓰기 대신 [file-1, file-2]처럼 번호가 자동으로 부여되면서 새 파일이 생성
let inboxPath = NSHomeDirectory() + "/Documents" + "/Inbox"
print("InboxPath:", inboxPath, "\n")

// 출력
InboxPath: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Documents/Inbox

 

<데이터 컨테이터 -> 라이브러리 폴더>

  • 유저 데이터 파일 및 임시 파일을 제외한 모든 파일들을 관리
  • 유저에게 노출되는 것을 피하고 앱의 기능이나 관리에 필요한 파일 저장
  • 주로 서브디렉토리인 Application Support와 Caches를 이용하지만 커스텀 디렉토리 사용이 가능
  • Preference, Cookies, Saved Application State, WebKit등 필요할 때 시스템에서 자동 생성
// 라이브러리 폴더 경로
let libraryPath1 = NSHomeDirectory() + "/Library"
print("LibraryPath1:", libraryPath1, "\n")

let libraryPath2 = FileManager.default.urls(for: FileManager.SearchPathDirectory.libraryDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)[0]
print("LibraryPath2:", libraryPath2, "\n")

let libraryPath3 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
print("LibraryPath3:", libraryPath3, "\n")

// 출력
LibraryPath1: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library

LibraryPath2: file:///Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/

LibraryPath3: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library

 

<데이터 컨테이터 -> 라이브러리 폴더 -> Application Support>

  • 앱의 기능 또는 관리를 위해 지속적으로 관리해야되는 파일 저장
  • Documents와 거의 동일한 속성을 가지지만, 유저에 대한 노출 여부에 따라 위치가 결정됩니다.
  • 주로 BundleID나 회사명 등의 서브디렉토리로 만들어 관리
  • CoreData 기본 저장 경로
  • Realm은 Documents경로를 사용하는데 Documents는 노출이 되기 때문에 중요한 정보들이 저장되어있으면 Application Support폴더로 변경해서 사용하는 것이 좋다.
let applicationSupportPath1 = FileManager.default.urls(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)[0]
print("applicationSupportPath1:", applicationSupportPath1, "\n")

let applicationSupportPath2 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
print("applicationSupportPath2:", applicationSupportPath2, "\n")
        
// 출력
applicationSupportPath1: file:///Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/Application%20Support/

applicationSupportPath2: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/Application Support

 

 

<데이터 컨테이터 -> 라이브러리 폴더 -> Caches>

  • 앱의 동작 속도/데이터 절약 등을 위해 사용되는 공간
  • 예를 들어 Background에서 Foreground로 넘어올 때 스냅샷 이미지로 사용됨.
let cachesPath1 = FileManager.default.urls(for: FileManager.SearchPathDirectory.cachesDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)[0]
print("cachesPath1:", cachesPath1, "\n")

let cachesPath2 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print("cachesPath2:", cachesPath2, "\n")

//출력
cachesPath1: file:///Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/Caches/

cachesPath2: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/Caches

 

 

<데이터 컨테이터 -> TemporaryDirectory>

  • 현재 앱 실행중에는 사용하지만 유지할 필요 없는 임시 파일 저장
  • 사용 후 필요없어진 파일은 직접 삭제해주는 것을 권장
let tempPath1 = NSHomeDirectory() + "/Temp"
print("tempPath1:", tempPath1, "\n")

let tempPath2 = NSTemporaryDirectory()
print("tempPath2:", tempPath2, "\n")

// 출력
tempPath1: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8DF81B9C-AA04-4A6A-BBCA-46B6AECA764E/Temp

tempPath2: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8DF81B9C-AA04-4A6A-BBCA-46B6AECA764E/tmp/

 

참고 자료

'iOS' 카테고리의 다른 글

[iOS] Cell Life Cycle  (1) 2019.07.30
[iOS] 코드사이닝, 인증서, 프로비저닝 프로파일이란?  (1) 2019.07.25
[iOS] ContentOffset과 ContentInset  (0) 2019.07.25
[iOS] ScrollView  (0) 2019.07.25
[iOS] Photos Framework  (0) 2019.07.25