์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- CRUD
- Firestore
- components
- AVAudioPlayer
- String.Index
- SWiFT
- Encodable
- UIRefreshController
- ExpressJS
- Mac
- map
- Filter
- MongoDB
- ์ฑ๋์์ธ
- nodejs
- mongoose
- Decodable
- ์๊ณ ๋ฆฌ์ฆ
- ios
- Firestore CRUD
- Codable
- Figma
- DispatchQueue
- RxSwift
- Core Data
- ์ฑ๋ง๋ค๊ธฐ
- Reduce
- ํ๋ก๊ทธ๋๋จธ์ค
- Cloud Firestore
- ์ง๋ฒ๋ณํ
- Today
- Total
Focus On Develop ๐ค๐ค
[Swift] FileManager ๋ณธ๋ฌธ
์ด๋ฒ ํฌ์คํ ์์๋ swift์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ FileManager๋ผ๋ ํด๋์ค๋ฅผ ์ด์ฉํด์, ํ์ผ์ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๊ณ , ์ญ์ ํ๋ ๊ฑธ ํด๋ณด๋ ค๊ณ ํด์. ์ผ๋ฐ์ ์ผ๋ก ๋ก์ปฌ์ ์ด๋ฏธ์ง, ์์, ํ ์คํธ ๋ฑ ํ์ผ์ ์ ์ฅํ๋ค ๋ถ๋ฌ์๋ค ํ ๋๋ FileManager๋ฅผ ํตํด ๋ก์ปฌ์ ํ์ผ์ ์ ์ฅํ๊ณ , ํ์ผ ๊ฒฝ๋ก์ ๋ํ ์ ๋ณด๋ฅผ CoreData ๋ฑ์ ํตํด์ ๊ด๋ฆฌํ์ฃ . ์ด ์ค์ ๋ก์ปฌ์ ํ์ผ์ ์ ์ฅํ๋ ๋จ๊ณ๋ฅผ ํด๋ณด๋ ค๊ณ ํด์!
๋ฐ๋ก ์์ํ ๊ป์!
File Domain
๋จผ์ macOS, iOS ๋ฑ apple์ ํ์ผ ์์คํ ์ ๊ธฐ๋ณธ์ ์ผ๋ก domain์ผ๋ก ํ์ผ๋ค์ ์์น๋ฅผ ๊ฒฐ์ ํด์. ์ด domain์ ๊ธฐ๋ณธ์ ์ผ๋ก user, local, network, system 4๊ฐ์ domain์ ์ ๊ณตํด์. ์๋ ๊ทธ๋ฆผ์ฒ๋ผ์!
์๋ฅผ ๋ค๋ฉด, ํฐ๋ฏธ๋์ ์ด๋ฉด ์ต์๋จ ๋ฃจํธ์์ pwd๋ฅผ ์น๋ฉด /Users/userName์ด ๋์ค์ฃ ?? ์ฆ ์ด๊ฑด ์ฌ์ฉ์๋ค์ ๊ธฐ๋ณธ์ ์ user domain์์ ๋๋ถ๋ถ์ ์์ ์ ์ํํ๊ฒ ๋๋ค๋ ์๋ฏธ์์.
FileManager
์์์ ๊ฐ๋จํ ์ค๋ช ํ๋ฏ์ด, Swift์์ ํ์ผ๊ด๋ฆฌ๋ฅผ ์ํด ์ ๊ณตํ๋ ํด๋์ค์ ๋๋ค. default๋ฅผ ํตํด ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ด์.
let fileManager = FileManager.default
urls ๋ผ๋ ๋ฉ์๋๋ฅผ ํตํด์, ์์ฒญํ๋ ๋๋ฉ์ธ์์ ์ง์ ๋ ๋๋ ํ ๋ฆฌ์ ๋ํ URL ๋ฐฐ์ด์ ๊ฐ์ ธ์ฌ ์ ์์ด์.
let documentUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
for ํ๋ผ๋ฏธํฐ๋ SearchPathDirectory ํ์ ์ด์์. enumํ์ ์ผ๋ก ์ ์๋์ด ์๊ณ , desktopDirectory, documentDirectory, downloadsDirectory ๋ฑ ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ์น์ํ ์ฌ์ฉํ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์์ธํ ์ฌํญ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
in ํ๋ผ๋ฏธํฐ๋ SearchPathDomainMask ํ์ ์ผ๋ก ์ญ์ enum์ผ๋ก ์ ์๋์ด ์์ด์. ์ด๊ฒ ๋ฐ๋ก ์ ์์์ ์ค๋ช ํ๋ 4๊ฐ์ง Domain ์ค ์ด๋ค ๋๋ฉ์ธ์ ์ฌ์ฉํ ๊ฑด์ง ์ ํํด์ฃผ๋ฉด ๋์. ์ญ์ ์์ธํ ์ฌํญ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
documentsUrl์ ์ถ๋ ฅํด๋ณด๋ฉด, ์ด๋ ๊ฒ ์ค์ ๋ก User ๋๋ฉ์ธ์ ๋ก์ปฌ์ ์ด๋ค ์ฃผ์๊ณต๊ฐ์ ๋ํ๋ด๊ณ ์์ด์. (Playground๋ก ์์ฑํ๋ ๊ฑฐ๋ผ XCPGDevices ์ด๋ฐ ๊ฒ๋ค์ด ๋ณด์ด๋ค์ ๐)
file:///Users/kyungtaekim/Library/Developer/XCPGDevices/5B2871C9-A4D8-492A-8048-71634DAAA618/data/Containers/Data/Application/9700E544-1347-4244-8AB0-F7C98086112E/Documents/
๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ก์ปฌ ๊ฒฝ๋ก๋ฅผ ์ ํํ์ผ๋, ๊ทธ ๊ฒฝ๋ก์ ์ฌ๋ฌ ์์ ๋ค์ ์๋ํด๋ณผ๊ฑฐ์์.
๋จผ์ ํด๋๋ฅผ ์์ฑํด๋ณผ๊ฒ์.
let directoryPath = documentUrl.appendingPathComponent("NewDirectory")
appendingPathComponent(ํด๋/ํ์ผ๋ช ) ๋ฉ์๋๋ฅผ ํตํด์, ์ฐ๋ฆฌ๊ฐ ์์์ ์ ํ๋ ์ ์ฅ ๊ฒฝ๋ก(documentUrl)์ ๋ง๋ค ์ด๋ค ํด๋/ํ์ผ๋ช ์ ์ ํด์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ directoryPath ์ด๋ ์์ ์ถ๋ ฅํด๋ณด๋ฉด
documentsUrl/NewDirectory
์ด๋ ๊ฒ ์์์ ๋ดค๋ documentsUrl ํ์์ ๊ฒฝ๋ก ํน์ ํ์ผ์ ๋ํ๋ด๊ณ ์์ด์.
do {
if !fileManager.fileExists(atPath: directoryPath.path) {
try fileManager.createDirectory(atPath: directoryPath.path, withIntermediateDirectories: false, attributes: nil)
}
} catch {
print("create folder error. do something")
}
๊ทธ ๊ฒฝ๋ก์ createDirectory ๋ฉ์๋๋ฅผ ํตํด ํด๋๋ฅผ ๋ง๋ค ์ ์์ด์. atPath ํ๋ผ๋ฏธํฐ๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๊ณ , withIntermediateDirectories ํ๋ผ๋ฏธํฐ๋ "์ค๊ฐ ๋๋ ํ ๋ฆฌ๋ค๋ ์ถ๊ฐํ ๊ฑฐ์ผ?" ๋ฅผ ๋ํ๋ด๊ณ , attributes ํ๋ผ๋ฏธํฐ๋ ํด๋น ํด๋๋ก์ ์ ๊ทผ๊ถํ, ๊ทธ๋ฃน ๋ฑ์ ํด๋ ์์ฑ์ด์์. ํด๋๋ ์๋ก ๋ง๋ค๋ ์ด๋ฏธ ์กด์ฌํ๋ฉด ์์ฑ์ ์คํจํด์, catch๋ฌธ์ผ๋ก ์ง์ ํด์. ๊ทธ๋์ fileExists() ๋ฉ์๋๋ก ๋จผ์ ํด๋น ๊ฒฝ๋ก์ ์กด์ฌํ๋์ง๋ฅผ ์ฒดํฌํ ํ์ ๋ง๋ค์ด ์ค์ผํฉ๋๋ค.
๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํด๋์ ํ์ผ์ ์ถ๊ฐํด๋ณผ๊ฒ์.
let filePath = directoryPath.appendingPathComponent("NewFile.txt")
๋์ผํ๊ฒ appendingPathComponent ๋ฉ์๋๋ฅผ ํตํด ํ์ผ๋ช ์ ์ง์ ํด์ค๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ํ์ผ์ ํ์ฅ์๋ฅผ ๊ฐ์ด ์จ์ค์ผํด์. ํ์ฅ์๋ฅผ ์จ์ฃผ์ง ์์๋ ์ ์ฅ์ ๋์ง๋ง, ์ฝ์ด์ฌ ์๊ฐ ์์ด์ ๐ญ
let textString = NSString(string: "here is new file")
do {
if !fileManager.fileExists(atPath: filePath.path) {
try textString.write(to: filePath, atomically: true, encoding: String.Encoding.utf8.rawValue)
}
} catch {
print("create file error. do something")
}
textString์ "here is new file" ์ด๋ผ๊ณ ๋ด์ฉ์ ์์ฑํ๊ณ , ์ด ๋ด์ฉ์ ์์์ ๋ง๋ค์๋ "NewFile.txt"์ write ๋ฉ์๋๋ฅผ ํตํด์ ์์ฑํด์ค ์ ์์ด์. ์ฌ๊ธฐ์ ํ๊ฐ์ง ์ ์ํด์ผ ํ ์ ์, ์์์ ํด๋ ์์ฑํ ๋๋ ์ด๋ฏธ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ฉด ํด๋ ์์ฑ์ ์คํจํ๋ค๊ณ ํ์ฃ ?? ๊ทผ๋ฐ ํ์ผ์ ๊ฒฝ์ฐ์๋ ์ด๋ฏธ ํ์ผ์ด ์์ด๋ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ํด๋ฒ๋ฆฌ๋, ์ํฉ์ ๋ฐ๋ผ fileExists๋ฅผ ์ฌ์ฉํด ๋ฎ์ด์ฐ๋ ๊ฑธ ๋ง์ ์ฃผ๋ ๊ฒ๋ ๊ณ ๋ คํด๋ณด์ธ์~!
ํฐ๋ฏธ๋์์ ์ง๊ธ ์ ๋๊ณ ์๋์ง ์ค๊ฐ์ ๊ฒ ํ๋ฒ ํด๋ณผ๊ฒ์~~~ ์๋๋๋ก ์ ์ ์ฅ๋๊ณ ์๋ค์!! ๐
์ด์ ํ์ผ ์ ์ฅ๊น์ง ํ์ผ๋, ์ ์ฅํ๋ ํ์ผ์ ์ฝ์ด์๋ณผ๊ฒ์!
do {
if fileManager.fileExists(atPath: filePath.path) {
let readString = try String(contentsOf: filePath, encoding: .utf8)
print(readString) // here is new file
}
} catch {
print("read file error. do something")
}
์ด๋ ๊ฒ filePath์ ์๋ ๋ด์ฉ์ String์ผ๋ก ๊ฐ์ ธ์ค๋ฉด ๋ฉ๋๋ค. ์ด๋ ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด catch ๋ธ๋ญ์ผ๋ก ๋น ์ง๊ฒ ๋์. ์ญ์ ์ด๋ฒ์๋ ํ์ผ์ด ์กด์ฌํ๋์ง ๋จผ์ ์ฒดํฌ๋ฅผ ํด์ฃผ๋๊ฒ ์ข๊ฒ ์ต๋๋ค ๐
๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ์ผ์ ์ญ์ ํด๋ณผ๊ฑฐ์์.
do {
if fileManager.fileExists(atPath: filePath.path) {
try fileManager.removeItem(at: filePath)
}
} catch {
print("remove file error. do something")
}
์ด๋ ๊ฒ removeItem() ๋ฉ์๋๋ฅผ ํตํด์ ์ญ์ ํ ์ ์์ด์. ์ด๋๋ ํ์ผ์ด ํด๋น ๊ฒฝ๋ก์ ์์ผ๋ฉด catch๋ก ๋น ์ง๋ ํ์ผ์ด ์กด์ฌํ๋์ง ๋จผ์ ์ฒดํฌ๋ฅผ ํด์ฃผ๋๋ก ํด์! ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ํ์ผ์ด ์ ์ญ์ ๋์๋์ง ํ์ธ๋ ํด๋ณด๊ตฌ์~~ ๐
๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๋๋ ์ญ์ ํ ์ ์์ด์!
do {
if fileManager.fileExists(atPath: directoryPath.path) {
try fileManager.removeItem(at: directoryPath)
}
} catch {
print("remove file error. do something")
}
์ญ์๋ ์ ์ญ์ ๋์๋์ง ํ๋ฒ ํ์ธ ํด์ฃผ๊ณ ์~~~ ๋ชจ๋ ์๋๋๋ก ์ ๋์๋ค์ ๐๐
์ค๋์ ์ด๋ ๊ฒ iOS์ ๊ธฐ๋ณธ์ ์ธ ํ์ผ ๊ตฌ์กฐ์ ๋ํด์ ์์๋ณด๊ณ , Swift์์ ์ ๊ณตํ๋ FileManager ํด๋์ค๋ฅผ ์ด์ฉํด ํด๋/ํ์ผ์ ๋ก์ปฌ์ ํน์ ๊ฒฝ๋ก์ ์ถ๊ฐ/์ญ์ ํ๋ ์ค์ต์ ํด๋ดค์ต๋๋ค!
์ค๋๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋์๊ธธ ๋ฐ๋์ ๐
'iOS [Swift] > ๊ธฐ์ด๋ฅผ ํํํ!' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Class vs Struct (0) | 2021.03.16 |
---|---|
[Swift] Singleton Pattern (์ฑ๊ธํค ํจํด) (0) | 2021.03.16 |
[Swift] Audio Recording (0) | 2021.03.01 |
[Swift] CaseIterable (0) | 2021.02.27 |
[Swift] typealias (0) | 2021.02.26 |