ต่อท้ายไฟล์ใน Go


88

ดังนั้นฉันสามารถอ่านจากไฟล์ในเครื่องได้ดังนี้:

data, error := ioutil.ReadFile(name)

และฉันสามารถเขียนลงในไฟล์ภายในเครื่องได้

ioutil.WriteFile(filename, content, permission)

แต่ฉันจะต่อท้ายไฟล์ได้อย่างไร? มีวิธีการในตัวหรือไม่?


4
ใช่คุณเข้าใจแล้ว ฟังก์ชัน ioutil เป็นเพียงสิ่งอำนวยความสะดวกที่ดูแลงานทั่วไป หากคุณต้องการการควบคุมที่มากขึ้นโปรดดูแพ็คเกจระบบปฏิบัติการ
Evan Shaw

คำตอบ:


148

คำตอบนี้ใช้ได้ใน 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

1
@SridharRatnakumar: ดูความคิดเห็นอื่นและคน umask ด้วย umask ทั่วไปของ 022 คุณจะได้รับสิทธิ์ทั่วไป:0666 & ~022 = 0644 = rw-r--r--
akavel

55
os.O_CREATE เป็นสิ่งที่ดีที่จะรวมไว้หากไฟล์อาจยังไม่มีอยู่
bugloaf

2
อาจจะเป็นคำถามโง่ ๆ แต่ทำไมถึงต้องการทั้งสองอย่างos.O_APPENDและos.O_WRONLY? ใช้งานได้แน่นอน แต่ทำไมทั้งสองอย่าง?
Dusan Gligoric

os.O_APPEND และ os.O_WRONLY os.O_APPEND คือการควบคุมพฤติกรรมในกรณีนี้ไปยังโหมด Append ดังนั้นจึงไม่จำเป็นต้องรักษาตัวชี้ไฟล์ os.O_WRONLY คือการระบุโหมดไฟล์อ่านเขียนหรือทั้งสองอย่างในกรณีนี้เขียน
Cyberience


28

คิดออก

ข้อมูลเพิ่มเติม

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

n, err := f.WriteString(text) 

f.Close()

8
คุณควรใช้ os ด้วย O_WRONLY
zhaozhi

stackoverflow.com/questions/33851692/… "โดยค่าเริ่มต้นคุณจะได้รับตัวอธิบายไฟล์แบบอ่านอย่างเดียว"
Han Qiu

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)

ฉันหวังว่านี่จะช่วยได้!

ฮาเวียร์



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)
        }
    }
}

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

defer f.Close()

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

การเปลี่ยนแปลงเล็กน้อยตามไซต์ golang และความคิดเห็นที่ได้รับการโหวตสูงสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.