본문 바로가기
UIKit/기본

Filemanager로 CRUD 해보기

by 밤새는탐험가 2024. 4. 4.

Filemanager 사용해보기 

 

먼저 위치를 확인한다.

아래 코드를 실행하면 콘솔창에 주소가 하나 뜬다. 

그걸 터미널에 열어서 open 주소라고 치면 

어떤 폴더가 나온다. 

이 폴더가 바로 앞으로 작업할 폴더 이다.  

 

override func viewDidLoad() {
    ...
    let manager = FileManager.default
        
        guard let url = manager.urls(
            for: .documentDirectory,
            in: .userDomainMask).first else { return }
            
            print(url.path)
    
}

 

 

작업을 저장할 폴더 만들기 

 

만들 때 먼저 해야하는 것이 

바로 "경로 설정"이다. 

 

여기서는 newFolderUrl 이라는 변수에 url (위에서 만든 변수) 변수로 설정된

경로 그 안에 들어갈 경로를 만든다. 

 

그 다음이 do ~ try - catch 문을 통해 폴더를 생성한다. 

 

let newFolderUrl = url.appendingPathComponent("ios-academy")

// ios-academy 폴더 생성
do {
    try manager.createDirectory(
        at: newFolderUrl,
        withIntermediateDirectories: true,
        attributes: [:])
} catch {
    print(error)
}

 

  ▶️ at: 경로 및 폴더명, 위에서 만든 newFolderUrl 사용 

 

  ▶️ withIntermediateDirectories: 참인 경우 이 메서드는 url에 디렉토리를 작성할 때 존재하지 않는 모든 상위 디렉토리를 작성합니다. false인 경우 중간 상위 디렉터리가 없는 경우 이 메서드는 실패합니다. (직역이라..)

여기서는 true로 했어요 .. 아직 에러는 안났어요..

 

  ▶️ attributes: 새 디렉터리에 대한 file 속성을 지정합니다. 소유자 및 그룹 번호, 파일 권한 및 수정 날짜를 설정할 수 있습니다. 이 매개 변수에 대해 nil을 지정하면 프로세스의 umask(2) macOS Developer Tools Manual Page에 따라 디렉터리가 생성됩니다.

 

 

여튼 위에 메서드를 실행하면 이렇게 폴더가 하나 만들어진다. 

 

 

폴더를 하나 만들었으니까 

그 안에 파일을 하나 만들려면?

 

폴더 생성하는 방법과 동일하나. 

그 호출하는 메서드가 다르다. 

여기서는 createFile이라는 메서드를 사용했다. 

 

 

let fileUrl = newFolderUrl.appendingPathComponent("logs.txt")

manager.createFile(
    atPath: fileUrl.path,
    contents: nil,
    attributes: [FileAttributeKey.creationDate:Date()])

 

 

위의 메서드를 호출하면 아래와 같이 파일이 하나 생성된다. 

 

 

 

 

 

생성한 파일 내에 데이터를 넣는다면?

그러니까 만약에 String 타입의 데이터를 넣고 싶다면???

 

그럴려면 면저 저정하고 싶은 String 타입의 데이터를 선언한다. 

 

그리고 그 데이터를 createFile 메서드를 호출해서 넣어준다. 

 

let data = "writing~~".data(using: .utf8)
manager.createFile(
                    atPath: fileUrl.path,
                    contents: data,
                    attributes: [FileAttributeKey.creationDate:Date()]
                    )

 

 

그러면 아래와 같이 파일내에 위에 써인 "writing ~~" 이 저장된다. 

 

 

 

그럼 위에 쓴 데이터를 삭제하고 싶다면?

이것도 마찬가지로 경로를 지정해주고 삭제를 하면 되는데,

먼저 삭제할 경로에 데이터가 있는지 여부를 확인해야한다. 

 

 

if manager.fileExists(atPath: fileUrl.path(percentEncoded: true)){
                    // print("파일이 있네 ")
                    do {
                        try manager.removeItem(at: fileUrl)
                    } catch {
                        print(error)
                    }
        
                }

 

 

 

 

근데 만약에 폴더를 삭제하고 싶다면?

이것도 마찬가지로 폴더 경로를 지정만 하면 된다. 

 

if manager.fileExists(atPath: fileUrl.path(percentEncoded: true)){
                    // print("파일이 있네 ")
                    do {
                        try manager.removeItem(at: newFolderUrl)
                    } catch {
                        print(error)
                    }
        
                }