Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- CloudWatch
- 정보처리기사실기 기출문제
- Spring
- Linux
- IntelliJ
- 오블완
- aws
- CKA
- kotlin querydsl
- kotlin
- 정보처리기사 실기 기출문제
- mysql 튜닝
- 티스토리챌린지
- 기록으로 실력을 쌓자
- Kubernetes
- MySQL
- 정보처리기사 실기
- Java
- Elasticsearch
- 코틀린 코루틴의 정석
- Pinpoint
- AI
- APM
- kotlin spring
- kotlin coroutine
- minikube
- PETERICA
- AWS EKS
- CKA 기출문제
- 공부
Archives
- Today
- Total
피터의 개발이야기
[Kotlin] File들을 코드별 폴더로 압축하기 본문
반응형
ㅁ 들어가며
ㅇ 밤 12시에 퇴근을 하였고, 집에 오면서 내일 해야할 일을 머리 속으로 정리하였다.
ㅇ 업무코드에 할당된 파일을 선택하면, 코드폴더별로 파일 목록을 압축해야 한다.
ㅁ 소스 코드
package com.peterica.demo
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.nio.file.Files
import java.nio.file.Path
import java.text.SimpleDateFormat
import java.util.*
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
fun main() {
val codeFileMap = mapOf(
"CODE1" to listOf("file1.txt", "file2.txt"),
"CODE2" to listOf("file3.txt", "file4.txt"),
"CODE3" to listOf("file5.txt", "file6.txt")
)
var randomPath = "temp"+(0..999999).random().toString()
val baseDir = File(randomPath)
baseDir.mkdir()
// 코드명으로 폴더 생성 및 파일 저장
codeFileMap.forEach { (code, files) ->
val codeDir = File(baseDir, code)
codeDir.mkdir()
files.forEach { fileName ->
File(codeDir, fileName).createNewFile()
}
}
// 폴더들을 압축
val zipFile = File(baseDir, "compressed_folders.zip")
ZipOutputStream(FileOutputStream(zipFile)).use { zipOut ->
baseDir.listFiles()?.filter { it.isDirectory }?.forEach { folder ->
addFolderToZip(folder, folder.name, zipOut)
}
}
println("폴더 생성 및 압축이 완료되었습니다.")
// 월별 저장 공간
// 파일 정리를 위해 월별 폴더를 분리
var monthPath = "zipDirRoot"+ "yyyyMM".getTimeNow()
var monthDir = File(monthPath)
if (!monthDir.exists()) monthDir.mkdir()
zipFile.copyTo(File(monthPath,"compressed_folders.zip"))
println("압축파일 이동 완료")
// temp 폴더 삭제
if (deleteFolder(baseDir))
println("temp 삭제 성공")
else
println("temp 삭제 실패")
}
fun addFolderToZip(folder: File, folderName: String, zipOut: ZipOutputStream) {
folder.listFiles()?.forEach { file ->
if (file.isDirectory) {
addFolderToZip(file, "$folderName/${file.name}", zipOut)
} else {
val entry = ZipEntry("$folderName/${file.name}")
zipOut.putNextEntry(entry)
FileInputStream(file).use { fileIn ->
fileIn.copyTo(zipOut)
}
zipOut.closeEntry()
}
}
}
// Kotlin Extension을 이용한 날짜 포맷
fun String.getTimeNow(): String {
return try {
val date = Date(System.currentTimeMillis())
val simpleDateFormat = SimpleDateFormat(this)
simpleDateFormat.format(date)
} catch (e: Exception) {
println(e.message)
""
}
}
// File 객체를 재쥐저긍로 삭제
fun deleteFolder(folder: File): Boolean {
if (folder.exists()) {
val files = folder.listFiles()
if (files != null) {
for (file in files) {
if (file.isDirectory) {
deleteFolder(file)
} else {
file.delete()
}
}
}
}
return folder.delete()
}
ㅇ codeFileMap에 코드명과 해당 코드에 속한 파일 목록을 정의한다.
ㅇ output 디렉토리를 생성한다.
ㅇ 각 코드명에 대해 폴더를 생성하고, 해당 폴더 안에 파일들을 생성한다.
ㅇ 생성된 폴더들을 compressed_folders.zip 파일로 압축한다.
ㅇ 압축 과정에서 addFolderToZip 함수를 재귀적으로 사용하여 모든 하위 폴더와 파일을 압축 파일에 추가한다.
ㅇ 이 코드를 실행하면 output 디렉토리 안에 코드명으로 된 폴더들이 생성되고, 각 폴더 안에 해당하는 파일들이 생성된다.
ㅇ 그리고 이 폴더들을 포함하는 compressed_folders.zip 파일이 생성된다.
ㅁ 마무리
ㅇ 이 코드는 코어로직을 작성하기 위한 목적으로 코딩되었으며, 실제 파일 내용은 비어있다.
ㅇ 소스는 여기
ㅁ 함께 보면 좋은 사이트
반응형
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] kotlin 폴더 전체 삭제 방법 (0) | 2024.07.13 |
---|---|
[Kotlin] List 사용법 정리 (0) | 2024.07.12 |
[Kotlin] MutableList 기능 설명 (0) | 2024.07.10 |
[Kotlin] Map 다양한 사용법 (1) | 2024.07.09 |
[Kotlin] 코틀린 MapStruct 사용방법 (0) | 2024.07.08 |
Comments