티스토리 뷰
안녕하세요 :) Zedd입니다.
제목이 뭔가 추상적인데.....이 글은...저를 위한....공부...
FileManager를 이용해 파일/폴더 만드는 법
파일 및 디렉토리와 관련된 가장 기본적인 작업 중 일부는 파일 시스템을 생성하고 파일 시스템 중심으로 이동시키는 것입니다. 이 작업은 앱이 작업을 수행하는데 필요한 파일 시스템 구조를 빌드하는 방법입니다 .대부분의 작업에서 NSFileManager클래스는 파일을 만들고 조작하는데 필요한 기능을 제공해야합니다.
Creating New Files and Directories Programmatically
Creating Directories
Creating New Files
createFileAtPath:contents:attributes:
(NSFileManager
)writeToURL:atomically:
(NSData
)writeToURL:atomically:
(NSString
)writeToURL:atomically:encoding:error:
(NSString
)writeToURL:atomically:
(Various collection classes define this method for writing out property lists.)open
function with theO_CREAT
option creates a new empty file
사용자에 의해 생성되는 모든 Contents는 Documents디렉토리에 저장되도록 권장?강제..?하고 있습니다. 적어도 Apple문서에서는요.
그럼 자 생각해봅시다.
내가 파일을 하나 어디에 저장하고 싶어. 그럼 Documents디렉토리 안에 저장되어야 할거에요.
그럼 중요한건? 네. 이 Document디렉토리가 어딨는지를 일단, 가장 먼저 알아야겠죠.
네 그렇습니다. 처음 할 거는 Document Directory URL얻기.
그 전에!!! 파일을 생성하기 가장 쉬운 방법은 FileManager를 사용하는 방법이죠?
let fileManager = FileManager.default
먼저 FileManager인스턴스를 생성해야겠죠? default는 FileManager의 싱글톤 인스턴스를 만들어준답니다.
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
저 urls라는 메소드는 요청된 도메인에서 지정된 공통 디렉토리에 대한 URL배열을 리턴해주는 메소드에요.
첫번째 파라미터는 검색 경로 디렉토리에요. 들어간 값을 보니, enum인 것 같죠?
무슨 값들이 있는지는 여기에 나와있어요. 그리고 두번째는 Domain을 나타내는 파라미터로, 다른 값들은 여기에 나와있어요.
정말 이 for와 in파라미터에 제가 정말 많은 실험을...해봤는데...일단 뭐 빈 배열도 있고, 막 에러는 안나는데 도대체인지 어디에 있는지도 모르겠고..
근데 사용자가 저장, 즉 생성하는 파일은 Documents에 저장되어야 한다니까....다른건 생각안해도 되는건지.......
너무 헷갈립니다..ㅠㅠ혹시 이것에 대해서 조금 아신다면..댓글이나 채널 메세지로 꼭...알려주세요.....
자. 그럼 우리는 지금 Documents디렉토리의 URL을 안거에요.
그럼 내가 뭐..파일을 추가한다고 생각해볼게요. 폴더를 추가할 수도 있겠지만요.
그럼 그 파일의 이름!! 이름있죠. 이름을 정해줘야 합니다.
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentsURL.appendingPathComponent("zedd의 파일")
자..이게 무슨뜻일까요. 아까 우리가 가져왔던 DocumentURL에 파라미터로 받은 path component를 추가하고 난!!! 이걸 추가하고 난!!!1그 이후의 URL을 돌려줍니다.
이상태까지만 하면, Files앱에 안나오는데, 뭔가를 써야 나오게 됩니다.
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentsURL.appendingPathComponent("zedd의 파일")
let myTextString = NSString(string: "HELLO WORLD")
try? myTextString.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8.rawValue)
이렇게 하면, 뭔가 해당 파일에 HELLO WORLD를 쓴다는 것 같죠? 맞습니다. 이렇게 까지 하고 실행을 하면,
이런게 생기게 되지만,
읽을 수 없습니다.
왜냐?
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentsURL.appendingPathComponent("zedd의 파일")
확장자를 정해주지 않았기 때문이죠.
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentsURL.appendingPathComponent("zedd의 파일.txt")
이렇게 해주고 실행시켜봅시다.
이러면...!!
이렇게 잘 나오게 되죠.
만약에 내가 파일을 "다운로드"한다고 쳐봅시다.
내가 다운로드 할 파일이 텍스트인지..뭔지 어케 알겠어요? 그래서 보통
let fileURL = documentsURL.appendingPathComponent((nameUrl?.lastPathComponent)!)
그 다운받으려는 파일의 URL있죠???? 보통 String이죠? "~~~~어쩌고 저쩌고"일텐데, 이 다운받으려는 URL을(String이지만) => 진짜 URL타입으로 바꿔주세요.
그러면, lastPathComponent라는 프로퍼티를 얻을 수 있는데, 딱 보면 알겠듯이 마지막 컴포넌트? 라는 말 같죠? 보통 가장 마지막에 "파일 이름"이 들어가기 때문에 대부분 lastPathComponent를 사용합니다.
위 코드에서 nameUrl이 다운받으려는 URL String을 URL타입으로 바꿔준 거에요.
Alamofire를 사용하면 파일 다운로드가 굉장히 쉬워진답니다. XD
let fileURL = documentsURL.appendingPathComponent((nameUrl?.lastPathComponent)!)
이렇게 얻은 FileURL있죠????이걸 넘겨주기만 하면, 해당 폴더에 다운로드를 해줘요. write이런거 안해도댐 ㅎㅎ
==> 내가 다운받았던 파일을 또 받으면 어케되냐? 알아서 저번꺼 삭제하고 다시 새로운걸로 만들어줌 ㅇㅇ
● 디렉토리 만드는법
let filePath = documentsURL.appendingPathComponent("zedd")
if !fileManager.fileExists(atPath: filePath.path) {
do {
try fileManager.createDirectory(atPath: filePath.path, withIntermediateDirectories: true, attributes: nil)
} catch {
NSLog("Couldn't create document directory")
}
}
원리는 파일과 똑같아요. createDirectory 메소드를 사용해서 디렉토리를 만들 위치만 지정해주면 디렉토리가 짠 하고 만들어진답니다.
이렇게요. 디렉토리 이름이 zedd인 이유는???
let filePath = documentsURL.appendingPathComponent("zedd")
이 코드 때문 ㅇㅇ
응용 1
그럼 내가 방금 zedd폴더에 파일 만들고 싶어 ㅇ0ㅇ..
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("zedd")
documentsURL을 애초에 "zedd"를 붙혀서 넘기면 되겠죠?
파일이름은 가렸어요..ㅎㅎ..암튼 저렇게 붙혀서 주면 걍 된다는거 ㅇㅇ
또 응용될 게 모가 있을까요...FileManager는 어려우면서도..하면서...오...진짜..직관의 끝.....어 그렇지 그렇지 하고 하게 되네요.
+ ) 응용..?은 아니지만..다른 확장자들도 잘 다운로드 되나 싶어서 제 Firebase Storage에 여러 타입의 파일들을 넣어서 다운로드 해봤어요.
다운로드 결과
잘되죠?!?!?! 눌러도 잘 나온답니다.
혹시 틀린점이나 궁금한점이 있으시다면 저도...공부중이라...잘 모르지만.....댓글이나 PC화면 오른쪽 하단에 있는 채널 서비스를 이용해서 메세지 보내주세요 :)
'iOS' 카테고리의 다른 글
iOS ) Accessibility(접근성) - Accessibility Programming Guide for iOS (1) (0) | 2018.03.01 |
---|---|
iOS ) CAEmitterLayer프로퍼티 정리 (0) | 2018.03.01 |
iOS ) FileManager 사용하면서 알아두면 좋을 것들 (3) | 2018.02.26 |
iOS ) 내 App의 데이터 보기 (0) | 2018.02.23 |
iOS ) Apple의 Sandbox정책과 Files앱 (1) | 2018.02.21 |
- 제이슨 파싱
- Accessibility
- WidgetKit
- FLUTTER
- WWDC
- swift tutorial
- 피아노
- 회고
- Git
- swift sort
- WKWebView
- np-complete
- fastlane
- 스위프트 문법
- github
- np-hard
- actor
- IOS
- SwiftUI
- Swift
- swift3
- Xcode
- swift array
- iOS delegate
- swift delegate
- Combine
- ios 13
- UIBezierPath
- swift 공부
- 스위프트
- Total
- Today
- Yesterday