来源:未知 时间:2022-03-31 18:46 作者:小飞侠 阅读:次
[导读] 今天公司有一个需求,要针对历史所有svg写入一个 width 和 height ,一个一个写很不现实,所以想的用golang去写,因为go好用,速度快! 主要思路: 利用 1: os 去批量操作文件 2: 利用 goqu...
今天公司有一个需求,要针对历史所有svg写入一个 width 和 height ,一个一个写很不现实,所以想的用golang去写,因为go好用,速度快! 主要思路:利用 1: os 去批量操作文件 2: 利用 goquery 去操作dom【你没听错,这是golang中的jquery,灰常好用,学习地址: https://pkg.go.dev/github.com/PuerkitoBio/goquery】 3: 最后利用 ioutil 去写入文件,为什么不直接用os呢?因为我喜欢... 不BB了,看源码: package main import ( "fmt" "io/ioutil" "os" "strings" "github.com/PuerkitoBio/goquery" ) var sourcePath string = "/Users/po/www/xxx/Web/assets/images/designer" // 目标目录 var targetPath string = "/Users/po/www/newsvg" var isOk bool = false func main() { fmt.Println(sourcePath) fmt.Println(targetPath) // 读取 toReadFile(sourcePath, targetPath) } // 读取路径 func toReadFile(sourcePath string, targetPath string) { osReader, err := os.ReadDir(sourcePath) if err != nil { fmt.Println("读取路径错误:", err) } fmt.Println(osReader) for index, dirName := range osReader { fmt.Println(index, dirName.IsDir(), dirName.Name()) fmt.Printf("%+v\n", dirName) if isOk { return } // 文件名称 fileName := dirName.Name() // 如果是目录则递归读取 if dirName.IsDir() { childPath := sourcePath + "/" + fileName newChildPath := targetPath + "/" + fileName fmt.Println("childPath: ", childPath) // 创建文件夹 CreateMutiDir(newChildPath) // 读取文件 toReadFile(childPath, newChildPath) } else { // 判断是文件 if strings.Contains(fileName, ".svg") { fileNamePath := sourcePath + "/" + fileName newfileNamePath := targetPath + "/" + fileName fileByte, err := ioutil.ReadFile(fileNamePath) if err != nil { fmt.Println("读取文件错误:", err) } // string(fileByte) fmt.Println("存在svg文件:", fileName, newfileNamePath) toChangeQuery(string(fileByte), newfileNamePath) // isOk = true } } } } // query func toChangeQuery(fileData string, newfileNamePath string) { dom, err := goquery.NewDocumentFromReader(strings.NewReader(fileData)) if err != nil { fmt.Println(err) } fmt.Println("解析svg:") firstSvg := dom.Find("svg").First() viewBoxData, exits := firstSvg.Attr("viewBox") firstSvgHtml, err := firstSvg.Html() if err != nil { fmt.Println("读取firstSvg失败:", err) } // firstSvgHtml fmt.Println(viewBoxData, exits) fmt.Println("解析svg - end") if exits { // 创建新的svg makeNewSvg(viewBoxData, firstSvgHtml, newfileNamePath) } } // 拼接svg func makeNewSvg(viewBoxData string, svgHtml string, newfileNamePath string) { wh := strings.Split(viewBoxData, " ") newSvgHtml := "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"" + viewBoxData + "\" width=\"" + wh[2] + "px\" height=\"" + wh[3] + "px\" >" newSvgHtml += svgHtml newSvgHtml += "</svg>" newSvgHtmlByte := []byte(newSvgHtml) err := ioutil.WriteFile(newfileNamePath, newSvgHtmlByte, 0777) if err != nil { fmt.Println("写入新文件失败:", err, newfileNamePath) } fmt.Println("新svg:", wh, newSvgHtml) } //调用os.MkdirAll递归创建文件夹 func CreateMutiDir(filePath string) error { if !isExist(filePath) { err := os.MkdirAll(filePath, os.ModePerm) if err != nil { fmt.Println("创建文件夹失败,error info:", err) return err } return err } return nil } // 判断所给路径文件/文件夹是否存在(返回true是存在) func isExist(path string) bool { _, err := os.Stat(path) //os.Stat获取文件信息 if err != nil { if os.IsExist(err) { return true } return false } return true } 升级利用多线程 // 声明一个等待组 var wg sync.WaitGroup func main() { fmt.Println(sourcePath) fmt.Println(targetPath) currentTime := time.Now().UnixNano() //获取当前时间,类型是Go的时间类型Time fmt.Println(currentTime) // 读取 toReadFile(sourcePath, targetPath) // 等待所有的任务完成 wg.Wait() // 循环结束 fmt.Printf("\n %c[1;40;32m%s%c[0m\n\n", 0x1B, allImgs, 0x1B) fmt.Printf("%+v\n", wg) currentTime2 := time.Now().UnixNano() //获取当前时间,类型是Go的时间类型Time fmt.Println((currentTime2 - currentTime) / 1e6) } 在方法里面 // 读取路径 func toReadFile(sourcePath string, targetPath string) { osReader, err := os.ReadDir(sourcePath) if err != nil { fmt.Println("读取路径错误:", err) } fmt.Println(osReader) wg.Add(1) // 退出函数关闭 defer wg.Done() ... 以上就是golang批量解析svg文件全部内容,感谢大家支持自学php网。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com