스위프트에서 NSFileManager 와 NSFileHandle 을 사용하여

앱 로컬 저장소에 디렉토리 생성 및 리스팅 , 파일 생성 및 내용 입력 읽기 삭제 등을 수행한다.



우선 앱 실행시 기본디렉토리에 하위 디렉토리를 생성하고 파일이 있는지 체크하여 파일을 생성해주기 위해 viewDidLoad 메소드를 아래와 같이 작성해준다.

또한 기존에 파일에 저장되어 있는 내용이 있다면 이를 불러와 레이블에 표시해주기 위해  readFileContents() 메소드를 호출해준다.

var newDir : String? // 새로운 디렉토리 생성에 사용할 전역변수


override func viewDidLoad() {

        super.viewDidLoad()

        

        // 디폴트 NSFileManager 객체에 대한 참조체 얻기

        let filemgr = NSFileManager.defaultManager()

        

        // 현재 애플리케이션의 Documents 디렉토리 얻기

        let curDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

        let docsDir = curDirectory[0] as String

        NSLog("Documents Directory : " + docsDir)

        

        //하위 디렉토리 생성

        let dirPath = filemgr.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)

        let docsURL = dirPath[0]

        newDir = docsURL.URLByAppendingPathComponent("subDir").path

        do {    //현재 애플리케이션의 Documents 디렉토리 하위에 subDir 이름의 하위 디렉토리 생성

            try filemgr.createDirectoryAtPath(newDir!, withIntermediateDirectories: true, attributes: nil)

        }catch let error as NSError {

            NSLog("Error : \(error.localizedDescription)")

        }

        

        NSLog("newDir : " + newDir!)

        

        //디렉토리 리스팅 (현재 애플리케이션의 Documents 디렉토리 하위 subDir 디렉토리 리스팅)

        let filemgrList = NSFileManager.defaultManager()

        do{

            let filelist = try filemgrList.contentsOfDirectoryAtPath(newDir!)

            for filename in filelist {

                NSLog("디렉토링 리스트 : \(filename)")

            }

        }catch{

            print("리스팅 실패!!")

        }

        

        //파일 존재여부 체크

        newDir = newDir! + "/test01.txt" //해당 디렉토리에 test01.txt 파일이 있는지 체크

        if filemgr.fileExistsAtPath(newDir!) {

            NSLog("File exists")

        }else{

            NSLog("File not found")

            //파일 생성

            if filemgr.createFileAtPath(newDir!, contents: nil, attributes:nil) {

                print("파일 생성 완료!") // 없으면 파일 생성

            }else{

                print("파일 생성 실패!")

            }

        }

        readFileContents() //기존에 저장되어있는 내용을 읽어서 화면에 보여준다.

 }



func readFileContents() {

        //파일의 내용 읽어서 화면에 보여주기

        let file : NSFileHandle? = NSFileHandle(forReadingAtPath: newDir!)

        if file == nil {

            NSLog("file open fail")

        } else {

            NSLog("file open success")

            //file?.seekToFileOffset(5) //특정 오프셋에서

            //file?.readDataOfLength(10) //특정 길이만큼 읽을때 사용

            let databuffer = file?.readDataToEndOfFile() //내용 전체를 읽는다.

            //화면에 보이게 하기 위해 NSData String으로 변환해준다.

            let out: String = String(data:databuffer!, encoding:NSUTF8StringEncoding)!

            file?.closeFile()

            label.text = out

        }

}






텍스트 필드에 입력한 내용을 다시 파일에 저장하기 위해 버튼에 액션이벤트를 넣어 아래 코드를 호출한다.

@IBAction func saveText(sender: AnyObject) {

        

        let file : NSFileHandle? = NSFileHandle(forUpdatingAtPath: newDir!)

        if file == nil {

            NSLog("file write fail")

        } else{

            let stringData = textBox.text

            let data = (stringData! as NSString).dataUsingEncoding(NSUTF8StringEncoding)

            file?.seekToEndOfFile()

            file?.writeData(data!)

            file?.closeFile()

            NSLog("file write success")

        }

        

        readFileContents() //파일에 저장된 내용 읽기를 통해 입력한 내용을 실시간으로 화면에 보여준다.    

 }






파일에 저장된 내용을 전부 삭제하기 위해 다른 버튼에 액션 이벤트를 넣어 삭제메소드를 호출한다.

@IBAction func deleteText(sender: AnyObject) {

        

        let file : NSFileHandle? = NSFileHandle(forUpdatingAtPath: newDir!)

        file?.truncateFileAtOffset(0)

        file?.closeFile()

        

        NSLog("file delete success")

        

        let fileRead : NSFileHandle? = NSFileHandle(forReadingAtPath: newDir!)

        let databuffer = fileRead?.readDataToEndOfFile()

        fileRead?.closeFile()

        label.text = String(databuffer!)

}


+ Recent posts