go语言无法在文件内容之中插入内容因此因此要借助临时文件。
fileObj.Read是不会读取相同的内容的,只会按顺序读取。
func f3(){
//打开要操作的文件
fileObj,err := os.OpenFile("./sb.txt", os.O_RDWR,0644)
if err != nil {
fmt.Printf("open file failed,err:%v",err)
return
}
//defer fileObj.Close() //将文件关闭
// 因为没有办法在文件中间插入内容,需要创建临时文件
tmpFile, err := os.OpenFile("./sb.tmp",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0644)
if err != nil {
fmt.Println("creat file failed: ", err)
return
}
//读取原文件写入临时文件
var ret [1]byte
n,err := fileObj.Read(ret[:])
if err != nil {
fmt.Printf("read file failed,err:%v",err)
return
}
// 写入临时文件
fmt.Println(n)
fmt.Println(string(ret[:]))
fmt.Println("1",string(ret[:n]))
tmpFile.Write(ret[:n])
// 再写入要插入的内容
var s []byte
s = []byte{'c'}
tmpFile.Write(s)
//紧接着把源文件后续内容写入临时文件
var x [1024]byte
// for{
h,err := fileObj.Read(x[:])
fmt.Println("22222",string(x[:]))
fmt.Println("333",h)
fmt.Println("444",string(x[:h]))
if err == io.EOF {
fmt.Println("end pf file",x[:h])
tmpFile.Write(x[:h])
return
//break
}
if err != nil {
fmt.Printf("read from file failed: %v",err)
return
}
fmt.Println("写入文件中:",string(x[:h]))
tmpFile.Write(x[:h])
// }
//源文件后续写入临时文件中
fileObj.Close()
tmpFile.Close()
os.Rename("./sb.tmp","./sb.txt")
}
证实fileObj.Read按顺序不重复读取代码:
func f4(){
fileObj,err := os.OpenFile("./sb.txt", os.O_RDWR,0644)
if err != nil {
fmt.Printf("open file failed,err:%v",err)
return
}
var ret [1]byte
n,err := fileObj.Read(ret[:])
if err != nil {
fmt.Printf("read file failed,err:%v",err)
return
}
fmt.Println("1",n)
fmt.Println("2",string(ret[:]))
var x [8]byte
h,err := fileObj.Read(x[:])
if err != nil {
fmt.Printf("read file failed,err:%v",err)
return
}
fmt.Println("3",h)
fmt.Println("4",string(x[:]))
var xz [1]byte
z,err := fileObj.Read(xz[:])
if err != nil {
fmt.Printf("read file failed,err:%v",err)
return
}
fmt.Println("5",z)
fmt.Println("6",string(xz[:]))
fileObj.Close()
}