bboyjing's blog

golang实现文件内容替换

前段时间发现博客的图片都失效了,检查了一下,原来是七牛云现在需要绑定一个备案过的域名来使用。一顿操作下来,终于把自己的域名备案好了,并且连通七牛云也测通了。下面最后一步就是需要把原来的域名全部替换掉。本人是用hexo来搭建博客的,所以只要把_posts文件夹下的所有markdown文件替换一遍就好了。当然有很多方便的方式,由于最近在学习golang,现在把用go实现的笨拙的过程记录下来。其实没啥好说的,直接把贴代码吧。如果有更好的实现方式,可以告知本人,在此谢过。

获取文件夹中的所有文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func getFiles(path string) []string {
files := make([]string, 0)
err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
if f == nil {
return err
}
if f.IsDir() {
return nil
}
files = append(files, path)
return nil
})
if err != nil {
fmt.Printf("filepath.Walk() returned %v\n", err)
}
return files
}

读取文件内容

将文件内容读取出来,如果文件中包含需要替换的字符串就直接替换掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
func readFile(filePath string) ([]byte, bool, error) {
f, err := os.OpenFile(filePath, os.O_RDONLY, 0644)
if err != nil {
return nil, false, err
}
defer f.Close()
reader := bufio.NewReader(f)
needHandle := false
output := make([]byte, 0)
for {
line, _, err := reader.ReadLine()
if err != nil {
if err == io.EOF {
return output, needHandle, nil
}
return nil, needHandle, err
}
if ok, _ := regexp.Match(ORIGIN, line); ok {
reg := regexp.MustCompile(ORIGIN)
newByte := reg.ReplaceAll(line, []byte(TARGET))
output = append(output, newByte...)
output = append(output, []byte("\n")...)
if !needHandle {
needHandle = true
}
} else {
output = append(output, line...)
output = append(output, []byte("\n")...)
}
}
return output, needHandle, nil
}

### 将读取的文件内容回写到文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func writeToFile(filePath string, outPut []byte) error {
f, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0600)
defer f.Close()
if err != nil {
return err
}
writer := bufio.NewWriter(f)
_, err = writer.Write(outPut)
if err != nil {
return err
}
writer.Flush()
return nil
}

启动函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main
import (
"bufio"
"fmt"
"io"
"os"
"path/filepath"
"regexp"
)
const (
ORIGIN = "http://7xvxof.com1.z0.glb.clouddn.com"
TARGET = "http://qiniu.*****.**"
)
func main() {
files := getFiles("/Users/zhangjing/hexo/source/_posts")
for _, file := range files {
output, needHandle, err := readFile(file)
if err != nil {
panic(err)
}
if needHandle {
err = writeToFile(file, output)
if err != nil {
panic(err)
}
fmt.Println(file)
}
}
fmt.Println("Done...")
}

如上代码已是全部内容。