主要思路:
不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文件全部内容,感谢大家支持。
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did18495