package main import ( "alistControl/alist" "fmt" "github.com/schollz/progressbar/v3" "io" "net/http" "os" "path/filepath" ) func main() { client := alistsdk.NewClient("https://alist-home.s1f.ren", "kyou", "WFBDGnBfjjkVowen2", false, 200) user, err := client.Login() if err != nil { panic(err) } fmt.Println(user) path := "/游戏/我的世界/常青藤Mods" list, err := client.List(path, "", 1, 100, false) if err != nil { fmt.Println(err) return } // 获取当前文件夹下 modes 目录的的文件列表,判断是否存在,不存在则上传 currentDir, err := os.Getwd() if err != nil { fmt.Println("无法获取当前工作目录:", err) return } // 构建mods文件夹的路径 modsPath := currentDir + "/mods" // 读取mods文件夹中的所有文件和子目录 files, err := os.ReadDir(modsPath) if err != nil { fmt.Println("无法读取mods文件夹:", err) return } // 打印所有文件和子目录的名称 for _, alistFile := range list { hasFile := false for _, file := range files { fileInfo, _ := file.Info() fileSize := fileInfo.Size() if file.Name() == alistFile.Name && fileSize == alistFile.Size { fmt.Println("文件已存在") hasFile = true } if !hasFile { fmt.Printf("%s文件不存在,开始下载\n", file.Name()) // 获取mods文件夹中的文件路径 filePath := modsPath + "/" + file.Name() fileUrl := client.GetFileDownloadUrl(path+"/"+file.Name(), user.BasePath) err = downloadFile(filePath, fileUrl) if err != nil { fmt.Println("下载文件失败:", err) return } } } } } // downloadFile 下载文件并保存到指定路径,显示文件名和进度条 func downloadFile(filePath string, fileUrl string) error { // 发送HTTP GET请求 resp, err := http.Get(fileUrl) if err != nil { return err } defer resp.Body.Close() // 获取文件名 fileName := filepath.Base(filePath) fmt.Printf("Downloading: %s\n", fileName) // 创建文件 out, err := os.Create(filePath) if err != nil { return err } defer out.Close() // 获取文件大小 totalSize := resp.ContentLength // 创建进度条 bar := progressbar.NewOptions64( totalSize, progressbar.OptionSetDescription("Progress"), progressbar.OptionSetWidth(30), progressbar.OptionShowBytes(true), progressbar.OptionShowCount(), progressbar.OptionSetTheme(progressbar.Theme{ Saucer: "=", SaucerHead: ">", SaucerPadding: " ", BarStart: "[", BarEnd: "]", }), ) // 创建带进度条的writer writer := io.MultiWriter(out, bar) // 将响应体复制到文件中并更新进度 _, err = io.Copy(writer, resp.Body) if err != nil { return err } // 确保进度条达到100% bar.Finish() fmt.Println() // 换行 return nil }