Go에서 파일에 추가


87

따라서 다음과 같이 로컬 파일에서 읽을 수 있습니다.

data, error := ioutil.ReadFile(name)

그리고 로컬 파일에 쓸 수 있습니다.

ioutil.WriteFile(filename, content, permission)

하지만 파일에 어떻게 추가 할 수 있습니까? 내장 된 방법이 있습니까?


4
네, 알았습니다. ioutil 함수는 일반적인 작업을 처리하는 편의 기능 일뿐입니다. 더 많은 제어를 원하면 os 패키지를 참조하십시오.
Evan Shaw

답변:


146

이 답변은 Go1에서 작동합니다.

f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
    panic(err)
}

defer f.Close()

if _, err = f.WriteString(text); err != nil {
    panic(err)
}

3
0666 파일 모드가 아닌 이유는 무엇입니까? 더 나은 기본값이라고 생각했습니다.
Dmitri Shuralyov 2013 년

1
@SridharRatnakumar : 다른 코멘트man umask를 참조하십시오 . 일반적인 umask 022를 사용하면 다음과 같은 일반적인 권한을 얻게됩니다.0666 & ~022 = 0644 = rw-r--r--
akavel

55
os.O_CREATE는 파일이 이미 존재하지 않는 경우 포함하는 것이 좋습니다.
bugloaf

2
어쩌면 조금 바보 같은 질문이지만 필요 모두 왜 os.O_APPENDos.O_WRONLY? 이것은 확실히 작동하지만 왜 둘 다입니까?
Dusan Gligoric

51

Go 문서에는 완벽한 예가 있습니다 .

package main

import (
    "log"
    "os"
)

func main() {
    // If the file doesn't exist, create it, or append to the file
    f, err := os.OpenFile("access.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        log.Fatal(err)
    }
    if _, err := f.Write([]byte("appended some data\n")); err != nil {
        log.Fatal(err)
    }
    if err := f.Close(); err != nil {
        log.Fatal(err)
    }
}


5

... 나는 fmt.Fprintf를 사용할 것입니다. 왜냐하면 작가를 받아들이 기 때문입니다 ... 그리고 연결 또는 파일은 작가이고 문자열 방식으로 쓰기가 쉽습니다.

f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0600)
if err != nil {
    panic(err)
}

defer f.Close()
fmt.Fprintf(f, "%s", text)

도움이 되었기를 바랍니다.

하비에르,


3

파일을 생성하려는 경우

f, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)


0

하자 당신이 파일의 내용을 추가하고 싶은 말은 current파일에 all코드가 작동 한 후 아래 :

func updateTrx() {
    var err error
    var f *os.File

    // If the file doesn't exist, create it, or append to the file
    if f, err = os.OpenFile("all.csv", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err := f.Close(); err != nil {
            log.Fatal("error", err)
        }
    }()

    var current *os.File
    if current, err = os.OpenFile("current.csv", os.O_RDONLY, 0); err != nil {
        log.Fatal("error", err)
    }

    defer func() {
        if err := current.Close(); err != nil {
            log.Fatal("error", err)
        }
    }()

    if fileBytes, err := ioutil.ReadAll(current); err != nil {
        log.Fatal("error", err)
    } else {
        if _, err := f.Write([]byte(fileBytes)); err != nil {
            log.Fatal(err)
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.