go – 文件操作(2) - 读与写的一个小例子
1、紧接着前面读与写的文件操作,我们来用go语言写一个修改ip地址的小脚本
#ifcfg-ens33
TYPE=Etherne
BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.146.129
PREFIX=24
GATEWAY=192.168.146.2
DNS1=8.8.8.8
2、首先尝试写的一个案例,在写的时候没有考虑周全,一边读一边写会造成一个死循环,除此之外,要有结束循环的读取
package main
import(
"bufio"
"fmt"
"log"
"os"
"strings"
)
func main() {
var filename, ip, netmask string
fmt.Scanf("%s %s %s", &filename, &ip, &netmask)
net_modiy(filename, ip, netmask)
}
func net_modiy(filename, ip, NETMASK string) {
file, err := os.OpenFile(filename, os.O_RDWR, 0666)
if err != nil {
log.Fatal("open file some error")
}
defer file.Close()
reader := bufio.NewReader(file)
writer := bufio.NewWriter(file)
line, err := reader.ReadString('\n')
for {
if strings.Contains(line, "IPADDR") {
line = fmt.Sprintf("IPADDR=", ip)
}
if strings.Contains(line, "NETWORK") {
line = fmt.Sprintf("NETMASK=", NETMASK)
}
writer.WriteString(line)
}
writer.Flush()
}
3、所以我们需要先读再写,把读出来的存放在一个reader里面,边读边修改,然后写入文件
package main
import (
"bufio"
"fmt"
"io"
"log"
"os"
"strings"
)
func main() {
var ip string
fmt.Scanf("%s", &ip)
lines := reader("ifcfg-ens33")
for i := 0; i < len(lines); i++ {
if strings.Contains(lines[i], "IPADDR") {
lines[i] = fmt.Sprint("IPADDR=", ip, "\n")
fmt.Println(lines[i])
}
}
str := strings.Join(lines, "")
writer("ifcfg-ens33", str)
}
func reader(filename string) []string {
var lines []string
file, err := os.OpenFile(filename, os.O_RDONLY, 0666)
if err != nil {
log.Fatal("open file wrong")
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err == io.EOF {
break
}
lines = append(lines, line)
}
return lines
}
func writer(filename, str string) {
file, err := os.OpenFile(filename, os.O_WRONLY, 0666)
if err != nil {
log.Fatal("open files wrong")
}
writ := bufio.NewWriter(file)
writ.WriteString(str)
writ.Flush()
}