호댕의 iOS 개발

[iOS] FileManager를 통해 파일을 생성해보자. 본문

Software Engineering/iOS

[iOS] FileManager를 통해 파일을 생성해보자.

호르댕댕댕 2022. 1. 10. 22:54

(fileManager 학습을 위해 Application Support, Documents, tmp에 파일을 생성해봤습니다)

 

FileManager를 사용하면 Xcode에서 손쉽게(?) 파일을 생성하고 내부 컨텐츠를 수정 및 추가도 할 수 있다. 삭제 또한 가능하다. 

그럼 어떻게 FileManager를 통해 파일을 생성하고 관리하는지 알아보자~~

 

 

⌨️ 알아두면 좋을 단축키

  • cmd + shift + . → 숨김 파일 보기
  • cmd + shift + g → 폴더 찾기
  • 폴더 생성 → touch 파일명.확장자 / echo “내용" > 파일명.확장자명

🗂 파일 위치

Application Support

라이브러리는 일단 숨김 파일로 되어 있기 때문에 사용자로 들어가서 cmd + shift + .를 해줘야 한다.

document

tmp

tmp는 Application Support와는 다르게 시스템에 위치해있다. 이는 NSTemporaryDirectory()와 동일하다.

 

📦 사용한 메서드 정리

1. 디렉토리의 주소를 찾는 경우

  • urls(for: in:) : FileManager의 인스턴스 메서드
    • directory: 찾을 path directory를 작성한다. 다양한 SearchPathDirectory를 가지고 있다.
    • domainMask: 찾을 file system의 도메인을 작성한다.
      • userDomainMask: 사용자의 홈 디렉토리
      • localDomainMask: 기기에서 모든 사람이 item을 설치할 수 있는 곳
      • networkDomainMask: 네트워크에서 item을 설치할 수 있는 곳
      • systemDomainMask: 애플에서 제공하는 시스템 파일을 위한 디렉토리
      • allDomainMask: 모든 도메인
  • FileManager.default: 싱글톤처럼 전역에서 사용할 수 있는 Filemanager 객체

2. 새로운 SubDirectory를 생성하는 경우

  • appendingPathComponent(_:) : 주어진 경로의 구성요소(URL)에 path component를 추가한 후 URL을 반환함
    • pathComponent: 추가할 path 구성 요소
  • createDirectory(at:withIntermediateDirectories:attributes:) : 주어진 attribute에 따라 디렉토리를 생성하는 메서드
    • url: 생성할 디렉토리를 지정해줌, 이는 반드시 nil이 되면 안됨.
    • createdIntermediates: true면 url에 디렉토리를 만드는 과정 중에 존재하지 않는 부모 디렉토리를 생성함. false라면 중간 상위 디렉토리가 존재하지 않는 경우 메소드가 실패함.
    • attributes: 새로운 디렉토리의 파일 속성(소유자 및 그룹 번호, 파일 권한, 수정일 등)을 정해준다. nil로 해주면 umask(2) macOS Developer Tools Manual Page에 따라 정해진다.

3. 파일에 새로운 내용 작성

  • write(to:atomically:encoding:) : 받은 URL에 지정한 encoding 방법을 통해 콘텐츠를 작성함.
    • url: 작성할 컨텐츠를 받을 주소로 file URLs만 지원한다.
    • useAuxiliaryFile: true면 auxiliary file에 기록하고 auxiliary file의 이름이 url로 바뀜. false면 url에 직접 기록을 하게 됨. true를 주면 url이 존재하는 경우 작성하는 동안 시스템이 충돌하게 되더라도 기록이 손상되지 않는 것을 보장.
    • enc: 출력에 사용할 인코딩 방법을 정함

4. 파일을 읽기

  • contents(atPath:) : 지정한 path의 파일 컨텐츠를 반환해줌. FileManager의 인스턴스 메서드

5. 파일을 삭제

  • removeItem(at:) : 지정한 URL의 파일 혹은 디렉토리를 삭제. FileManager의 인스턴스 메서드

 

전체 코드는 다음과 같습니다. 

import Foundation

let fileManager = FileManager.default // default는 fileManager의 싱글톤 인스턴스를 생성해줌

let appSupportURL = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! // 왜 first를 붙이는 것일까??
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let tempURL = fileManager.temporaryDirectory // 이건 시스템에 위치한 tmp 폴더임. NSTemporaryDirectory와 동일

// create subdirectory
let appSupportDirectoryURL = appSupportURL.appendingPathComponent("FileIOExample")
let documentsDirectoryURL = documentsURL.appendingPathComponent("FileIOExample")
let tempDirectoryURL = tempURL.appendingPathComponent("FileIOExample")
try? fileManager.createDirectory(at: appSupportDirectoryURL, withIntermediateDirectories: true, attributes: nil)
try? fileManager.createDirectory(at: documentsDirectoryURL, withIntermediateDirectories: true, attributes: nil)
try? fileManager.createDirectory(at: tempDirectoryURL, withIntermediateDirectories: true, attributes: nil)

// create file
let appSupportFile = appSupportDirectoryURL.appendingPathComponent("abc.txt")
let documentsFile = documentsDirectoryURL.appendingPathComponent("abc.txt")
let tmpFile = tempDirectoryURL.appendingPathComponent("abc.txt")

// write file
let textString = "Hello, Files"
try? textString.write(to: appSupportFile, atomically: true, encoding: .utf8)
try? textString.write(to: documentsFile, atomically: true, encoding: .utf8)
try? textString.write(to: tmpFile, atomically: true, encoding: .utf8)
// write는 NSString의 인스턴스 메서드

// read file
let appSupportContent = fileManager.contents(atPath: appSupportFile.path)!
let documentsContent = fileManager.contents(atPath: documentsFile.path)!
let tmpContent = fileManager.contents(atPath: tmpFile.path)!
var appSupportContentString = String(data: appSupportContent, encoding: .utf8)!
var documentsContentString = String(data: documentsContent, encoding: .utf8)!
var tmpContentString = String(data: tmpContent, encoding: .utf8)!
print(appSupportContentString)
print(documentsContentString)
print(tmpContentString)

// modify file
let modifyTextString = "Hello, World"
try? modifyTextString.write(to: appSupportFile, atomically: true, encoding: .utf8)
try? modifyTextString.write(to: documentsFile, atomically: true, encoding: .utf8)
try? modifyTextString.write(to: tmpFile, atomically: true, encoding: .utf8)

// delete all file
try? fileManager.removeItem(at: appSupportDirectoryURL)
try? fileManager.removeItem(at: documentsDirectoryURL)
try? fileManager.removeItem(at: tempDirectoryURL)
Comments