본문 바로가기

학습 노트/iOS (2021)

180. File Manager #3

Slide Action

deleteDictionary(), deleteFile()

   func deleteDirectory(at url: URL) {
	   do {
		   try FileManager.default.removeItem(at: url)
		   refreshContents()
	   } catch {
		   print(error)
	   }
   }
   
   func deleteFile(at url: URL) {
	   do {
		   try FileManager.default.removeItem(at: url)
		   refreshContents()
	   } catch {
		   print(error)
	   }
   }

두 메서드는 같은 방식으로 구현된다.

  • 대상 삭제

removeItem(at:)

 

Apple Developer Documentation

 

developer.apple.com

해당 메서드는 URL로 전달된 파일이나 경로를 삭제하고, true나 false를 반환한다.

	  let deleteAction = UITableViewRowAction(style: .destructive, title: "Delete") { [weak self] (action, indexPath) in
		 if let target = self?.contents[indexPath.row] {
			switch target.type {
			case .directory:
			   self?.deleteDirectory(at: target.url)
			case .file:
			   self?.deleteFile(at: target.url)
			}
		 }
	  }

필요한 URL은 해당 SlideAction에서 contents에 담긴 url을 전달하는 방식으로 얻을 수 있다.

  • 새로고침

삭제에 성공한 경우 tableView를 새로고침해 변경된 데이터를 반영한다.

rename()

   func renameItem(at url: URL) {
	  let name = "newname"
	   let ext = (url.lastPathComponent as NSString).pathExtension
	   
	   let newUrl = url.deletingLastPathComponent().appendingPathComponent(name).appendingPathExtension(ext)
	   
	   do {
		   try FileManager.default.moveItem(at: url, to: newUrl)
		   refreshContents()
	   } catch {
		   print(error)
	   }
   }

파일이나 경로의 이름 변경은 실제로 대상의 이름을 변경하는 것이 아닌,
새로운 경로로 '이동'하는 것에 가깝다.

deletingLastPathComponents()

 

Apple Developer Documentation

 

developer.apple.com

deletingLastPathComponents 메서드는 전달된 URL에서 가장 마지막 Component를 삭제하고 이를 반환한다.

이어서 

appendingPathComponent()와 appendingPathExtension() 메서드를 사용해,
새로운 이름과 확장자를 붙여 이동할 새로운 URL을 생성한다.

FileManager의 moveItem(at:to:) 메서드를 사용해
이동시킨 후 tableView를 새로고침하면 구현이 완료된다.

 

updateBackupProperty()

   func updateBackupProperty(of url: URL, exclude: Bool) {
	   do {
		   var targetUrl = url
		   var values = try targetUrl.resourceValues(forKeys: [.isExcludedFromBackupKey])
		   values.isExcludedFromBackup = exclude
		   try targetUrl.setResourceValues(values)
	   } catch {
		   print(error)
	   }
	   
	   refreshContents()
   }

url의 resourceValues(forKeys:)를 사용해 BackupKey에 접근한다.

resourceValues(forKeys:)

 

Apple Developer Documentation

 

developer.apple.com

해당 속성의 값을 전달된 exclude 값으로 변경하고, 이를 다시 url의 ResourceValues로 덮어 쓴다.
이후 tableView를 새로고침한다.

해당 동작은 대상의 isExcludedFromBackup 상태에 따라 분기하며,
true이면 exclude로 false를, false 이면 true를 전달해 호출하도록 구현돼있다.

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

183 ~ 184. NSCoding and Codable  (0) 2022.01.27
181 ~ 182. User Defaults and Property List  (0) 2022.01.22
179. File Manager #2  (0) 2022.01.19
178. File Manager #1  (0) 2022.01.12
177. Data Persistence Overview  (0) 2022.01.10