golang實現檔案內容替換
前段時間發現部落格的圖片都失效了,檢查了一下,原來是七牛雲現在需要繫結一個備案過的域名來使用。一頓操作下來,終於把自己的域名備案好了,並且連通七牛雲也測通了。下面最後一步就是需要把原來的域名全部替換掉。本人是用hexo來搭建部落格的,所以只要把_posts資料夾下的所有markdown檔案替換一遍就好了。當然有很多方便的方式,由於最近在學習golang,現在把用go實現的笨拙的過程記錄下來。其實沒啥好說的,直接把貼程式碼吧。如果有更好的實現方式,可以告知本人,在此謝過。
獲取資料夾中的所有檔案
func getFiles(pathstring)[]string { files := make([]string, 0) err := filepath.Walk(path, func(pathstring, 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 }
讀取檔案內容
將檔案內容讀取出來,如果檔案中包含需要替換的字串就直接替換掉
func readFile(filePathstring)([]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 }
### 將讀取的檔案內容回寫到檔案中
func writeToFile(filePathstring, 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 }
啟動函式
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...") }
如上程式碼已是全部內容。