Nối vào một tệp trong Go


87

Vì vậy, tôi có thể đọc từ một tệp cục bộ như vậy:

data, error := ioutil.ReadFile(name)

Và tôi có thể ghi vào một tệp cục bộ

ioutil.WriteFile(filename, content, permission)

Nhưng làm thế nào tôi có thể nối vào một tệp? Có một phương pháp tích hợp sẵn không?


4
Đúng, bạn hiểu rồi. Các chức năng ioutil chỉ là những tiện ích đảm nhận các công việc thông thường. Nếu bạn muốn kiểm soát nhiều hơn, hãy xem gói hệ điều hành.
Evan Shaw

Câu trả lời:


146

Câu trả lời này hoạt động trong 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
Tại sao không phải là chế độ tệp 0666? Tôi nghĩ rằng đó là một giá trị mặc định tốt hơn.
Dmitri Shuralyov

1
@SridharRatnakumar: xem một bình luận khácngười đàn ông umask . Với umask điển hình là 022, bạn sẽ nhận được các quyền điển hình:0666 & ~022 = 0644 = rw-r--r--
akavel

55
os.O_CREATE rất tốt để đưa vào nếu tệp có thể chưa tồn tại.
bugloaf

2
có thể là một câu hỏi hơi ngu ngốc nhưng tại sao nó sẽ cần cả hai os.O_APPENDos.O_WRONLY? Điều này làm việc chắc chắn nhưng tại sao cả hai?
Dusan Gligoric

51

Go docs có một ví dụ hoàn hảo :

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

... Tôi sẽ sử dụng fmt.Fprintf, bởi vì chấp nhận một trình viết ... và kết nối hoặc các tệp sẽ là một trình ghi và dễ dàng viết theo cách chuỗi ...

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)

Tôi hy vọng điều này giúp đỡ!

Javier,


3

Nếu bạn cũng muốn tạo tệp

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


0

Giả sử bạn muốn thêm nội dung của tệp currentvào tệp all, thì mã bên dưới đang hoạt động:

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)
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.