Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SWIFTUI
- SWIFT
- 스타트업주니어로살아남기
- Failed to register bundle identifier
- View Life Cycle
- Mock
- Info.plist
- 야곰아카데미
- @available
- delegation
- IOS
- 부트캠프
- roundingMode
- human interface guidelines
- xcode
- 독서후기
- viewcontroller
- Navigation
- UIResponder
- Codegen
- 책후기
- NotificationCenter
- Modality
- NumberFormatter
- contentInset
- mvvm
- Structures and Classes
- 독후감
- 스위프트
- 아이폰
Archives
- Today
- Total
호댕의 iOS 개발
[iOS] FileManager를 통해 파일을 생성해보자. 본문
(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)
'Software Engineering > iOS' 카테고리의 다른 글
[iOS] 이미지의 크기 자체를 줄이고 싶다면? (0) | 2022.01.22 |
---|---|
[iOS] 이미지를 받고, 이미지의 크기를 크롭하기 (0) | 2022.01.22 |
[라이브러리] SwiftLint를 사용해봅시다~ (1) | 2022.01.08 |
[iOS] hitTest와 responderChain (0) | 2022.01.02 |
[iOS] Setting에서 Larger Accessibility Sizes 설정에 따른 레이아웃 변경 (0) | 2021.12.18 |
Comments