|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"io"
|
|
|
|
|
"os"
|
|
|
|
|
|
|
|
|
|
"b612.me/starlog"
|
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var attachcmd = &cobra.Command{
|
|
|
|
|
Use: "attach",
|
|
|
|
|
Short: "合并多个文件",
|
|
|
|
|
Long: "合并多个文件",
|
|
|
|
|
Run: func(this *cobra.Command, args []string) {
|
|
|
|
|
src, _ := this.Flags().GetStringArray("src")
|
|
|
|
|
out, _ := this.Flags().GetString("out")
|
|
|
|
|
if len(src) < 2 || out == "" {
|
|
|
|
|
starlog.Criticalln("请输入至少2个输入路径,一个输出路径")
|
|
|
|
|
os.Exit(1)
|
|
|
|
|
}
|
|
|
|
|
os.Exit(runAttach(src, out))
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func runAttach(src []string, out string) int {
|
|
|
|
|
fpOut, err := os.Create(out)
|
|
|
|
|
if err != nil {
|
|
|
|
|
starlog.Errorln("Err:无法创建输出文件!", err)
|
|
|
|
|
return 2
|
|
|
|
|
}
|
|
|
|
|
defer fpOut.Close()
|
|
|
|
|
for _, file := range src {
|
|
|
|
|
fpFile, err := os.OpenFile(file, os.O_RDONLY, 0644)
|
|
|
|
|
if err != nil {
|
|
|
|
|
starlog.Errorln("Err:Cannot Openfile:", err)
|
|
|
|
|
return 3
|
|
|
|
|
}
|
|
|
|
|
stats, err := fpFile.Stat()
|
|
|
|
|
if err != nil {
|
|
|
|
|
starlog.Errorln("Err:Cannot Get File Stats:", err)
|
|
|
|
|
return 4
|
|
|
|
|
}
|
|
|
|
|
if stats.Size() == 0 {
|
|
|
|
|
starlog.Warningf("文件:%s为空文件,跳过!\n", stats.Name())
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
buf := make([]byte, 65535)
|
|
|
|
|
sumAll := 0
|
|
|
|
|
for {
|
|
|
|
|
n, err := fpFile.Read(buf)
|
|
|
|
|
if err != nil && err != io.EOF {
|
|
|
|
|
starlog.Errorln("Err:Error Occured While ReadFile:", err)
|
|
|
|
|
fpFile.Close()
|
|
|
|
|
return 5
|
|
|
|
|
}
|
|
|
|
|
sumAll += n
|
|
|
|
|
_, errW := fpOut.Write(buf[:n])
|
|
|
|
|
if errW != nil {
|
|
|
|
|
starlog.Errorln("Error While Write Data to OutFile", errW)
|
|
|
|
|
return 6
|
|
|
|
|
}
|
|
|
|
|
starlog.StdPrintf([]starlog.Attr{starlog.FgGreen}, "文件%s,已完成:%.2f%%\r", stats.Name(), (float64(sumAll) / float64(stats.Size()) * 100.0000))
|
|
|
|
|
if err == io.EOF {
|
|
|
|
|
starlog.StdPrintf([]starlog.Attr{starlog.FgGreen}, "文件:%v,已完成:100.00%% \n", stats.Name())
|
|
|
|
|
fpFile.Close()
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
starlog.StdPrintln([]starlog.Attr{starlog.FgGreen}, "Ok!文件合并完成")
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
attachcmd.Flags().StringArrayP("src", "s", []string{}, "源文件路径")
|
|
|
|
|
attachcmd.Flags().StringP("out", "o", "", "输出文件路径")
|
|
|
|
|
}
|