Project 18 - FileManager

DaY·2021년 5월 7일
1

iOS

목록 보기
40/52
post-thumbnail

FileManager

swift에서는 파일들을 다루기 위한 클래스로 FileManager를 제공하고 있다.
FileManager는 FileManager.default 인스턴스를 기본으로 제공하며, 원하면 자신만의 인스턴스를 새롭게 생성할 수도 있다.
파일시스템의 파일 혹은 디렉토리들은 모두 경로를 가지고 있어 URL 혹은 String 데이터 타입을 통해 파일에 접근할 수 있도록 해준다.

Directory 접근

contentsOfDirectory(atPath:) 메소드

// FileManager 인스턴스 생성
let fileManager = FileManager()

// 해당 디렉토리 경로
let desktopPath = "/Users/userName/Desktop"

do {
    // 디렉토리 안의 파일 리스트를 배열로 변환
    let contents = try fileManager.contentsOfDirectory(atPath: desktopPath)

    // 디렉토리 하위의 모든 파일을 배열로 변환
    let deeperContents = try fileManager.subpathsOfDirectory(atPath: desktopPath)

    ...

} catch let error as NSError {
    print("\(error)")
}

Directory 생성

createDirectory(atPath:withIntermediateDirectories:attributes:) 메소드

let fileManager = FileManager()

// 디렉토리 경로
let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!

// 해당 디렉토리 이름 지정
let dataPath = documentsDirectory.appendingPathComponent("Directory")

do {
    // 디렉토리 생성
    try fileManager.createDirectory(atPath: dataPath.path, withIntermediateDirectories: false, attributes: nil)

} catch let error as NSError {
    print("\(error.localizedDescription)")
}

파일 생성 & 작성

do {
    // 파일 기존 경로에 추가
    let defaultPath = dataPath.appendingPathComponent("first.txt")

    let text = "Hello"

    do {
        // 쓰기 작업
        try text.write(to: defaultPath, atomically: false, encoding: .utf8)
    }
} catch let error as NSError {
    print("\(error.localizedDescription)")
}

파일 읽기

do {
    // 파일 기존 경로에 추가
    let defaultPath = dataPath.appendingPathComponent("first.txt")

    // 내용 읽기
    let text = try String(contentsOf: defaultPath, encoding: .utf8)

    ...
}
catch let error as NSError {
    print("\(error.localizedDescription)")
}

이미지 읽기

let savedURL = documents.appendingPathComponent(Filenames.Albums)
var data = try? Data(contentsOf: savedURL)
        
if data == nil, let bundleURL = Bundle.main.url(forResource: Filenames.Albums, withExtension: nil) {
    data = try? Data(contentsOf: bundleURL)
}

if let albumData = data, let decodedAlbums = try? JSONDecoder().decode([Album].self, from: albumData) {
    albums = decodedAlbums
    saveAlbums()
}
func saveAlbums() {
    let url = documents.appendingPathComponent(Filenames.Albums)
    let encoder = JSONEncoder()
        
    guard let encodedData = try? encoder.encode(albums) else {
        return
    }
    try? encodedData.write(to: url)
}

0개의 댓글