本文将介绍一个使用Go语言编写的脚本,其主要功能是解析XML文件并基于解析结果重命名文件夹。这个脚本适用于需要对文件夹进行批量重命名,并且重命名规则依赖于XML文件内容的情况。
脚本功能概述
Steam创意工坊下载的Mod文件夹批量重命名为id+名称
运行前:
运行后:
步骤:
- 获取当前工作目录:脚本首先获取当前的工作目录,以便后续操作基于此目录进行。
- 读取目录内容:接着,脚本读取并遍历当前目录下的所有文件和文件夹。
- 查找并解析XML文件:对于每个子文件夹,脚本检查是否存在
About/About.xml
文件。如果存在,脚本将读取并解析此XML文件。 - 读取PublishedFileId.txt:脚本还会读取
About/PublishedFileId.txt
文件的内容。 - 重命名文件夹:最后,脚本使用从XML和
PublishedFileId.txt
文件中获取的信息来重命名子文件夹。
代码解析
导入必要的包
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
"path/filepath"
)
这些包分别用于XML解析、格式化输出、文件读取、操作系统操作和路径操作。
定义ModMetaData结构体
type ModMetaData struct {
Name string `xml:"name"`
}
此结构体用于解析XML文件中的<name>
标签。
main函数
func main() {
// ... 省略了部分代码
}
主函数是脚本的入口点。
获取当前工作目录
currentDir, err := os.Getwd()
if err != nil {
fmt.Println("获取当前工作目录失败:", err)
return
}
这里,脚本尝试获取当前的工作目录。如果失败,脚本将打印错误信息并退出。
读取目录内容
files, err := os.ReadDir(currentDir)
if err != nil {
fmt.Println("读取目录内容出错:", err)
return
}
脚本读取并存储当前目录下的所有文件和文件夹。
遍历目录内容
for _, file := range files {
if file.IsDir() {
// ... 省略了部分代码
}
}
对于每个子文件夹,脚本执行以下操作。
解析XML和重命名文件夹
这部分代码涉及读取XML文件、解析XML内容、读取PublishedFileId.txt
文件以及重命名文件夹。这些操作基于前面的步骤获取的路径和文件名。
完整代码
go.mod
module steamModRenamer
go 1.22
main.go
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
"path/filepath"
)
// ModMetaData 结构体用于解析XML
type ModMetaData struct {
Name string `xml:"name"`
}
func main() {
// 获取当前工作目录
currentDir, err := os.Getwd()
if err != nil {
fmt.Println("获取当前工作目录失败:", err)
return
}
// 读取目录内容
files, err := os.ReadDir(currentDir)
if err != nil {
fmt.Println("读取目录内容出错:", err)
return
}
// 遍历目录内容,打印出所有子文件夹
for _, file := range files {
if file.IsDir() {
// 构建About.xml的路径
path := filepath.Join(currentDir, file.Name())
aboutXMLPath := filepath.Join(path, "About", "About.xml")
// 检查About.xml文件是否存在
if _, err := os.Stat(aboutXMLPath); err == nil {
// 读取About.xml文件内容
xmlData, err := ioutil.ReadFile(aboutXMLPath)
if err != nil {
fmt.Println("读取文件失败:", err)
continue
}
// 解析XML
var modMetaData ModMetaData
if err := xml.Unmarshal(xmlData, &modMetaData); err != nil {
fmt.Println("解析XML失败:", err)
continue
}
filePath := filepath.Join(currentDir, file.Name(), "About", "PublishedFileId.txt")
// 直接读取整个文件内容
data, err := os.ReadFile(filePath)
if err != nil {
fmt.Println("Error reading file:", err)
continue
}
// 获取新的文件夹名称
newDirName := string(data) + " " + modMetaData.Name
// 重命名子文件夹
if err := os.Rename(path, filepath.Join(filepath.Dir(path), newDirName)); err != nil {
fmt.Println("重命名文件夹失败:", err)
continue
}
fmt.Printf("文件夹已重命名为: %s\n", newDirName)
}
}
}
}
总结
这个Go脚本是一个实用的工具,用于根据XML文件的内容批量重命名文件夹。通过结合XML解析和文件操作,脚本能够自动化处理原本需要手动执行的重复性任务。这种自动化不仅提高了效率,还减少了出错的可能性。