本人环境配置
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_EXCL
与 O_CREATE 一起使用,当文件已经存在时 Open 操作失败。O_SYNC
以同步方式打开文件。每次 write 系统调用后都等待实际的物理 I/O 完成后才返回,默认(不使用该标记)是使用缓冲的,也就是说每次的写操作是写到系统内核缓冲区中,等系统缓冲区满后才写到实际存储设备。O_TRUNC
如果文件已存在,打开时将会清空文件内容。必须于 O_WRONLY 或 O_RDWR 配合使用。截断文件,需要有写的权限。