golang追加内容到文件顶部


本人环境配置

ubuntu: 17.04
go: go1.8.1 linux/amd64

实现方式

将整个文件内容全部读取,添加内容到头部, 并覆盖写入原文件中.

代码

/*
RewriteFile 覆盖写入文件
*/
func RewriteFile(file, head string) bool {
    if file == "" || contents == "" {
        return false
    }
    fi, err := os.Open(file) // 打开文件
    defer fi.Close()         //关闭文件
    if err != nil {
        panic(err)
    }
    contents, _ := ioutil.ReadAll(fi) // 读取所有内容
    newcontents := head + contents      // 组装新的内容

    newfi, err := os.OpenFile(file, os.O_WRONLY|os.O_TRUNC, 0600)
    // newfi, err := os.OpenFile(file, os.O_RDWR, 0666) // 打开文件
    defer newfi.Close()
    if err != nil {
        panic(err)
    }
    // newfi.Seek(0, os.SEEK_SET)
    // num, err := newfi.WriteAt([]byte(newcontents), 0) // 在开头覆盖插入内容
    num, err := newfi.WriteString(newcontents) // 写入文件
    if err != nil || num < 1 {
        return false
    }
    return true
}

原始的os包,没有追加内容到顶部的方法 ^1

关于 os package 和包的 WriteAt 一些说明:

  • The os package doesn’t have Seek, or WriteAt functions. The os.File type has methods with those names.
  • You have to use os.OpenFile if you want to modify an existing file, as os.Open only reads a file, and os.Create only creates a new file
  • WriteAt will OVERWRITE the contents from the given offset, so your expected result “12A345” is incorrect. It is not possible to insert characters in the middle of the file with the WriteAt or Write methods.

追加内容到文件末尾:

示例1: ^2

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    fileHandle, _ := os.OpenFile("output.txt", os.O_APPEND, 0666)
    writer := bufio.NewWriter(fileHandle)
    defer fileHandle.Close()

    fmt.Fprintln(writer, "String I want to append")
    writer.Flush()
}

示例2: ^3

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

defer f.Close()

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

os.OpenFile 文件打开方式(flag)

  • O_RDONLY只读文式打开文件。
  • O_WRONLY只写方式打开文件。
  • O_RDWR读写方式打开文件
  • O_APPEND追加方式打开文件,写入的数据将追加到文件尾
  • O_CREATE 当文件不存在时创建文件。
  • O_EXCLO_CREATE 一起使用,当文件已经存在时 Open 操作失败。
  • O_SYNC同步方式打开文件。每次 write 系统调用后都等待实际的物理 I/O 完成后才返回,默认(不使用该标记)是使用缓冲的,也就是说每次的写操作是写到系统内核缓冲区中,等系统缓冲区满后才写到实际存储设备。
  • O_TRUNC 如果文件已存在,打开时将会清空文件内容。必须于 O_WRONLYO_RDWR 配合使用。截断文件,需要有写的权限。

参考文档


Author: Itaken
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Itaken !
  TOC目录