관리 메뉴

피터의 개발이야기

[Kotlin] File들을 코드별 폴더로 압축하기 본문

Programming/Kotlin

[Kotlin] File들을 코드별 폴더로 압축하기

기록하는 백앤드개발자 2024. 7. 11. 18:14
반응형

ㅁ 들어가며

ㅇ 밤 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 파일이 생성된다.

 

ㅁ 마무리

ㅇ 이 코드는 코어로직을 작성하기 위한 목적으로 코딩되었으며, 실제 파일 내용은 비어있다.

ㅇ 소스는 여기

 

ㅁ 함께 보면 좋은 사이트

Android Kotlin - Date Format 현재날짜 & 'yyyy' vs 'YYYY'

반응형
Comments