package main import ( "flag" "fmt" "strconv" "strings" ) // paramConfig 设置并返回配置文件路径的命令行参数。 // 该函数接收一个 flag.FlagSet 指针作为参数,用于注册 "-config" 标志, // 默认值为 "cfg.toml",返回存储配置文件路径的字符串指针。 func paramConfig(fs *flag.FlagSet) *string { return fs.String("config", "cfg.toml", "Config file.") } func paramMap(fs *flag.FlagSet) *string { return fs.String("map", "", "target map setting") } func paramSourcePath(fs *flag.FlagSet) *string { return fs.String("source", "", "Source path or filename") } func paramSourceConvertedPath(fs *flag.FlagSet) *string { return fs.String("source", "", "Source path of the converted files") } func paramTaskDesc(fs *flag.FlagSet) *string { return fs.String("desc", "", "Task description") } func paramDestPath(fs *flag.FlagSet) *string { return fs.String("dest", "", "Destination path or filename") } func paramOutputHashFile(fs *flag.FlagSet) *string { return fs.String("hashfile", "", "Output hash file") } func paramInputHashFile(fs *flag.FlagSet) *string { return fs.String("hashfile", "", "Input hash file") } func paramFilterStatus(fs *flag.FlagSet) *string { return fs.String("status", "", "Filter status. enums 'all', 'waiting', 'running', 'success', 'fail', 'deleted'") } func paramAppid(fs *flag.FlagSet) *string { return fs.String("appid", "", "Wechat appid") } func paramUserids(fs *flag.FlagSet) *string { return fs.String("userids", "", "Device ID or Wechat UserID, separated by comma") } func paramSha256(fs *flag.FlagSet) *string { return fs.String("sha256", "", "Task SHA256 hash") } func paramBatchSize(fs *flag.FlagSet) *uint { return fs.Uint("batchsize", 10000, "Batch size to sync") } func paramBlockSize(fs *flag.FlagSet) *string { return fs.String("blocksize", "50M", "Block size to make hash. using size mode K, M, G, T") } func paramClear(fs *flag.FlagSet) *bool { return fs.Bool("clear", false, "Clear all data before write") } func paramDataSpaceId(fs *flag.FlagSet) *string { return fs.String("ds", "", "Data space ID") } // ParseByteSize 解析字节大小字符串为字节数 func ParseByteSize(sizeStr string) (uint64, error) { sizeStr = strings.TrimSpace(sizeStr) unit := "" numStr := sizeStr // 提取单位 if len(sizeStr) > 1 && (sizeStr[len(sizeStr)-1] == 'B' || sizeStr[len(sizeStr)-1] == 'b') { unit = string(sizeStr[len(sizeStr)-2:]) numStr = sizeStr[:len(sizeStr)-2] } else if len(sizeStr) > 0 && (sizeStr[len(sizeStr)-1] >= 'A' && sizeStr[len(sizeStr)-1] <= 'Z' || sizeStr[len(sizeStr)-1] >= 'a' && sizeStr[len(sizeStr)-1] <= 'z') { unit = string(sizeStr[len(sizeStr)-1]) numStr = sizeStr[:len(sizeStr)-1] } // 解析数字部分 num, err := strconv.ParseFloat(numStr, 64) if err != nil { return 0, err } // 根据单位计算字节数 switch strings.ToUpper(unit) { case "": return uint64(num), nil case "K", "KB": return uint64(num * 1024), nil case "M", "MB": return uint64(num * 1024 * 1024), nil case "G", "GB": return uint64(num * 1024 * 1024 * 1024), nil case "T", "TB": return uint64(num * 1024 * 1024 * 1024 * 1024), nil default: return 0, fmt.Errorf("unknown unit: %s", unit) } }