[go] Go 언어의 파일 및 디렉토리 복사

Go 언어를 사용하여 파일이나 디렉토리를 다른 위치로 복사하는 방법을 알아보겠습니다. 파일을 복사하기 위해서는 osio 패키지를, 디렉토리를 복사하기 위해서는 ospath/filepath 패키지를 사용할 수 있습니다.

파일 복사하기

다음은 Go 언어를 사용하여 파일을 복사하는 간단한 예제입니다. osio 패키지를 사용하여 파일을 복사할 수 있습니다.

package main

import (
    "os"
    "io"
)

func copyFile(src, dst string) (err error) {
    srcFile, err := os.Open(src)
    if err != nil {
        return
    }
    defer srcFile.Close()

    dstFile, err := os.Create(dst)
    if err != nil {
        return
    }
    defer dstFile.Close()

    _, err = io.Copy(dstFile, srcFile)
    if err != nil {
        return
    }

    err = dstFile.Sync()
    return
}

위의 예제에서 copyFile 함수는 소스 파일 경로 src와 대상 파일 경로 dst를 매개변수로 받습니다. 함수 내부에서는 os.Open으로 원본 파일을 열고, os.Create로 대상 파일을 생성한 다음, io.Copy로 내용을 복사합니다.

디렉토리 복사하기

디렉토리를 복사하는 방법도 간단합니다. ospath/filepath 패키지를 사용하여 디렉토리를 복사할 수 있습니다.

package main

import (
    "os"
    "io"
    "path/filepath"
)

func copyDir(src, dst string) (err error) {
    srcInfo, err := os.Stat(src)
    if err != nil {
        return
    }

    err = os.MkdirAll(dst, srcInfo.Mode())
    if err != nil {
        return
    }

    directory, _ := os.Open(src)
    objects, err := directory.Readdir(-1)

    for _, obj := range objects {
        srcFile := filepath.Join(src, obj.Name())
        destFile := filepath.Join(dst, obj.Name())

        if obj.IsDir() {
            err = copyDir(srcFile, destFile)
            if err != nil {
                return
            }
        } else {
            err = copyFile(srcFile, destFile)
            if err != nil {
                return
            }
        }
    }
    return
}

copyDir 함수는 소스 디렉토리 경로 src와 대상 디렉토리 경로 dst를 매개변수로 받습니다. 함수 내부에서는 원본 디렉토리의 정보를 가져와 대상 디렉토리를 생성한 뒤, os.Open으로 디렉토리를 열고 Readdir로 모든 파일 및 디렉토리를 읽어옵니다. 그 후 재귀적으로 디렉토리를 복사합니다.

이제 파일과 디렉토리를 복사하기 위한 기본적인 방법을 알아보았습니다. Go 언어에서는 이렇게 간단한 방법으로 파일과 디렉토리를 복사할 수 있습니다.

참고: Go 언어 공식 문서