在文件的中间部分插入内容
由于Go语言不支持原生的在文件中插入数据(实际所有语言都不支持),在此采用的方案是新建一个file.tmp
临时文件,先将要插入位置前的内容写到临时文件中,再将插入内容写入临时文件,最后将插入位置后的内容写入临时文件。操作完成后,删除旧文件,重命名临时文件为之前文件名。
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
func fileInsertInfo(){
// 打开要操作的文件 os.O_RDWR: 可读可写
file, err := os.OpenFile("./hello.txt", os.O_RDWR, 0544)
if err != nil {
fmt.Printf("File open failed! err: %v\n", err)
return
}
reader := bufio.NewReader(file)
// 新建临时文件
tempFile, err := os.OpenFile("./hello.tmp", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
fmt.Printf("Temp create failed! err: %v\n", err)
return
}
writer := bufio.NewWriter(tempFile)
_ = writer.Flush()
// 在第二行插入新内容
// 将原文件写入临时文件
line, err := reader.ReadString('\n') // 依次读一行
if err != nil {
fmt.Printf("Read file failed! err: %v\n", err)
return
}
// 写入临时文件
_, _ = writer.WriteString(line)
_ = writer.Flush()
// 移动光标
//_, _ = file.Seek(int64(len(line)), 0)
// 写入要插入的内容
var tempInfo string
tempInfo = "hi world!\n"
_, _ = tempFile.WriteString(tempInfo)
// 把源文件的后续内容写入临时文件
for{
line, err := reader.ReadString('\n') // 依次读一行
if err == io.EOF{
break
}
if err != nil{
fmt.Printf("File raed failed! err: %v\n", err)
return
}
_, _ = writer.WriteString(line)
}
_ = writer.Flush()
file.Close()
tempFile.Close()
err = os.Rename("./hello.tmp", "./hello.txt")
if err != nil{
fmt.Printf("Rename file raed failed! err: %v\n", err)
return
}
}
func main() {
fileInsertInfo()
}