본문 바로가기
개발/swift

[iOS/Swift] 파일, 폴더 용량 계산하기

by 꼬마상어 2017. 5. 25.
반응형

하다보면 앱 내에 캐시이미지 용량같은 것을 표시해야 할 경우가 있다.

 

일단, 폴더 용량과 파일용량을 계산하는 방법이 다르다.

 

1. 캐시이미지 용량

 

func getCacheCapacityAsMB() -> String {
	/* 캐시 이미지의 용량을 측정합니다. */
		/* 해당 이미지 폴더 url 입력 */
		let cacheUrl = getDocumentsDirectory().appendingPathComponent("cache")
		let cacheUrlString = cacheUrl.path
		
		var folderSize = 0
		
		let filemgrList = FileManager.default
		if filemgrList.fileExists(atPath: cacheUrlString) {
			do {
				let attribute = try FileManager.default.attributesOfItem(atPath: cacheUrlString)
				folderSize += attribute[FileAttributeKey.size] as! Int
			
				let filelist = try filemgrList.contentsOfDirectory(atPath: cacheUrlString)
				filelist.forEach { file in
					
						let tmp = cacheUrlString.appending("/\(file)")
						
						do {
							let attribute = try FileManager.default.attributesOfItem(atPath: tmp)
							folderSize += attribute[FileAttributeKey.size] as! Int
							
						} catch let error as NSError {
							print("\(#function) error: \(error)")
						}

				}
				
			} catch let error as NSError {
				print("\(#function) error: \(error)")
			}
		}
		
		let byteCountFormatter = ByteCountFormatter()
		byteCountFormatter.allowedUnits = .useMB
		byteCountFormatter.countStyle = .file
		let folderSizeToDisplay = byteCountFormatter.string(fromByteCount: Int64(folderSize))
		
		return folderSize == 0 ? "0 MB" : folderSizeToDisplay
		
	}

 

2. 폴더 크기를 측정

제외하는 파일 없이 모든 파일의 용량을 측정하고자 할때는 파일단위로 계산하면 forEach 문을 쓴다던가,, 이런 반복문을 쓰는것이 비효율적이라고 생각한다..

func getCapacityAsMB() -> String {
		
		let contentsUrl = getDocumentsDirectory().appendingPathComponent("contents")
		
		var folderSize = 0
		
                 if FileManager.default.fileExists(atPath: contentsUrl.path) {
				do {
					FileManager.default.enumerator(at: oidUrl, includingPropertiesForKeys: [.fileSizeKey], options: [])?.forEach {
						folderSize += (try? ($0 as? URL)?.resourceValues(forKeys: [.fileSizeKey]))??.fileSize ?? 0
					}
				}
	        }
		
		let byteCountFormatter = ByteCountFormatter()
		byteCountFormatter.allowedUnits = .useMB
		byteCountFormatter.countStyle = .file
		let folderSizeToDisplay = byteCountFormatter.string(fromByteCount: Int64(folderSize))
		
		return folderSize == 0 ? "0 MB" : folderSizeToDisplay

	}

 

 

반응형

댓글