본문 바로가기

학습 노트/iOS (2021)

179. File Manager #2

Directory 추가

func addDirectory(named: String) {
	   guard let url = currentDirectoryUrl?.appendingPathComponent(named, isDirectory: true) else { return }
	   
	   do {
		   try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
		   refreshContents()
	   } catch {
		   print(error)
	   }
   }
  • URL 추가

현재의 Directory URL을 받아와 appendingPathComponent 메서드를 사용해 새로운 경로를 생성한다.

appendingPathComponent()

 

Apple Developer Documentation

 

developer.apple.com

파라미터인 isDirectory가 true일 경우 경로에 사용되는 문자를 자동으로 추가한다.

  • Directory 생성

createDirectory()

 

Apple Developer Documentation

 

developer.apple.com

앞서 추가한 URL을 토대로 새로운 경로를 생성한다.
파라미터중 withIntermediateDirectories를 true로 전달하면 전달된 url에 존재하지 않는 경로가 있는 경우 자동으로 생성한다.
attributes는 보통은 nil을 전달하지만 macOS 개발시 폴더의 접근 권한을 설정할 때 사용된다.

  • 새로고침

새로운 Directory가 성공적으로 생성되면 현재 Directory를 새로고침해 TableView에 표시한다.

 

Add File

addTextFile()

   func addTextFile() {
	   guard let sourceUrl = Bundle.main.url(forResource: "lorem", withExtension: "rtf") else { return }
	   
	   guard let targetUrl = currentDirectoryUrl?.appendingPathComponent("lorem").appendingPathExtension("rtf") else { return }
	   
	   do {
		   let data = try Data(contentsOf: sourceUrl)
		   try data.write(to: targetUrl)
		   
		   refreshContents()
	   } catch {
		   print(error)
	   }
   }

addImageFile()

   func addImageFile() {
	   guard let sourceUrl = Bundle.main.url(forResource: "testImage", withExtension: "gif") else { return }
	   
	   guard let targetUrl = currentDirectoryUrl?.appendingPathComponent("testImage").appendingPathExtension("gif") else { return }
	   
	   do {
		   let data = try Data(contentsOf: sourceUrl)
		   try data.write(to: targetUrl)
		   
		   refreshContents()
	   } catch {
		   print(error)
	   }
   }

앱에 이미 추가한 이미지나 텍스트 파일 등은 읽기 전용인 Bundle Container에 포함된다.

  • 파일 접근

Bundle Container는 Bundle Class로 접근할 수 있고,
파일의 종류는 확장자로 구분하게 된다.

Bundle.main.url()

 

Apple Developer Documentation

 

developer.apple.com

파일 명과 확장자를 문자열로 전달해 원하는 파일에 접근한다.

  • 경로 생성

파일을 위치 시킬 새로운 Directory를 생성한다.

사용되는 메서드는 appendingPathComponent()와 appendingPathExtension()으로 각각 파일명과 확장자를 경로에 추가한다.

appendingPathComponent()

 

Apple Developer Documentation

 

developer.apple.com

 

 

appendingPathExtension()

 

Apple Developer Documentation

 

developer.apple.com

  • 새로운 경로에 파일 작성

추가할 파일의 url과 새로운 경로를 사용해 파일을 작성한다.

Data(contentsOf:)

메서드에 url을 사용하는 방식은 파일을 읽는 가장 기본적인 방식이다.

write(to:)

 

Apple Developer Documentation

 

developer.apple.com

메서드에 전달되는 경로레 파일을 작성하게 된다.
string, NSDictionary, NSArray등이 write 메서드를 제공한다.

 

파일 열기

Open()

   func open(content: Content) {
	   let ext = (content.url.lastPathComponent as NSString).pathExtension.lowercased()
	   
	   switch ext {
	   case "rtf":
		   performSegue(withIdentifier: "textSegue", sender: content.url)
	   case "gif", "png", "jpg", "jpeg":
		   performSegue(withIdentifier: "imageSegue", sender: content.url)
	   default:
		   showNotSupportedAlert()
	   }
   }
  • Url의 확장자 확인

lastPathComponent

 

Apple Developer Documentation

 

developer.apple.com

변수 ext에는lastPathComponent 속성을 사용해 url의 마지막 component를 반환한다.
이 반환형이 String이기 때문에 URL로써 처리하기엔 부적합하고, 이를 NSString으로 변환해 쉽게 처리할 수 있다.

pathExtension

 

Apple Developer Documentation

 

developer.apple.com

pathExtension 속성은 위에서 변환한 NSString의 속성으로 확장자를 반환한다.

이렇게 반환된 확장자를 통해 분기해 파일에 알맞는 ViewContainer를 호출한다.

textViewer

String(contentsOf:)

 

Apple Developer Documentation

 

developer.apple.com

viewDidLoad에서 View를 표시할 때 전달된 url을 textView에 표시한다.

imageViewer

Data(contentsOf:)

 

Apple Developer Documentation

 

developer.apple.com

viewDidLoad에서 전달된 url을 사용해 이미지를 표시한다.
이때 imageView의 image에는 UIImage가 전달돼야 하므로, 이를 다시 한 번 변환해야함에 주의한다.

rtf파일은 Rich Text File로 서식에 관한 데이터가 포함된다.
해당 데이터들은 textViewer에서 지원하지 않으므로 위와 같이 표시 되는 것이 정상이다.
imageViewer도 gif 재생을 지원하지 않는다.
따라서 결과 화면은 실습의 gif파일이 아닌 별도의 png 파일이며, 정상적으로 출력된다.

'학습 노트 > iOS (2021)' 카테고리의 다른 글

181 ~ 182. User Defaults and Property List  (0) 2022.01.22
180. File Manager #3  (0) 2022.01.19
178. File Manager #1  (0) 2022.01.12
177. Data Persistence Overview  (0) 2022.01.10
176. GCD in Action  (0) 2022.01.10