관리 메뉴

피터의 개발이야기

[Kotlin] Kotlin으로 Shell 유틸리티 만들기: 파일 복사와 압축 본문

Programming/Kotlin

[Kotlin] Kotlin으로 Shell 유틸리티 만들기: 파일 복사와 압축

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

ㅁ 들어가며

ㅇ 대량의 파일을 JVM에서 처리할 경우 OOME의 위험이 있어, 커널에서 직접 처리하기로 결정되었다.

ㅇ kotlin에서 커널에 명령을 줄 수 있고, 이를 Kotlin에서 간편하게 쓸 수 있는 방법을 찾고 있다.

ㅇ kotlin으로 shell 명령어를 사용하여 파일을 복사하고 압축하는 util을 만들어 보았다.

 

ㅁ ShellUtil.kt

import java.io.File

object ShellUtil {

    /**
     * cp 명령을 사용하여 파일을 복사한다.
     * 원본 파일 경로와 대상 경로를 인자로 받는다.
     * -r: 디렉토리 복사(없으면 생성)
      */
    fun copyFile(source: String, destination: String): Boolean {
        val command = "cp  $source $destination"
        println(command)
        return executeCommand(command)
    }

    /**
     * zip 명령을 사용하여 파일을 압축한다.
     * 압축할 파일 경로와 압축 결과 파일 경로를 인자로 받는다.
     */
    fun compressFile(source: String, destination: String): Boolean {
        val command = "zip -r $destination $source"
        println(command)
        return executeCommand(command)
    }

    /**
     * 압축 파일 무결성 검사를 진행한다.
     * 압축된 파일 경로를 인자로 받는다.
     * $ unzip -t file.zip
     * Archive:  file.zip
     *     testing: source/CODE1/test1.png   OK
     * No errors detected in compressed data of file.zip.
     */
    fun checkZipFile(destination: String): Boolean {
        val command = "unzip -t $destination"
        println(command)
        return executeCommand(command)
    }

    /**
     * 실제 shell 명령을 실행하는 private 함수이다.
     * Runtime.getRuntime().exec()를 사용하여 명령을 실행한다.
     * 명령 실행 결과를 boolean 값으로 반환한다 (성공: true, 실패: false).
     */
    private fun executeCommand(command: String): Boolean {
        return try {
            val process = Runtime.getRuntime().exec(command)
            val exitCode = process.waitFor()
            exitCode == 0
        } catch (e: Exception) {
            println("Error executing command: ${e.message}")
            false
        }
    }
}

 

ㅁ 사용 예

fun main() {
    val sourceFile = "source/CODE1/test1.png"
    val destinationFile = "source/CODE1/test3.png"
    val compressedFile = "compressed/file.zip"

    // 파일 복사
    if (ShellUtil.copyFile(sourceFile, destinationFile)) {
        println("파일 복사 성공")
    } else {
        println("파일 복사 실패")
    }

    // 파일 압축
    if (ShellUtil.compressFile(sourceFile, compressedFile)) {
        println("파일 압축 성공")
    } else {
        println("파일 압축 실패")
    }

    // 압축 파일 무결성 검사
    if (ShellUtil.checkZipFile(compressedFile)) {
        println("압축 무결성 검사 성공")
    } else {
        println("압축 무결성 검사 실패")
    }
}

출력:
cp  source/CODE1/test1.png source/CODE1/test3.png
파일 복사 성공
zip -r compressed/file.zip source/CODE1/test1.png
파일 압축 성공
unzip -t compressed/file.zip
압축 무결성 검사 성공

 

ㅁ 마무리

이 코드는 Linux나 macOS 같은 Unix 기반 시스템에서 동작한다. Windows에서는 다른 명령어를 사용해야 할 수 있다.

이 유틸리티 클래스를 사용하면 Kotlin 코드 내에서 간단하게 파일 복사와 압축 작업을 수행할 수 있다.

필요에 따라 다른 shell 명령어도 추가하여 기능을 확장할 수 있다.

ㅁ 함께 보면 좋은 사이트

Kotlin, 쉘 스크립트 작성하기

 

반응형
Comments