| | |
| | | "basic.com/valib/logger.git" |
| | | "compress/gzip" |
| | | "errors" |
| | | "fmt" |
| | | "io" |
| | | "io/ioutil" |
| | | "log" |
| | | "os" |
| | | "path" |
| | | "path/filepath" |
| | | "strings" |
| | | ) |
| | | |
| | |
| | | logger.Debug("文件名称是", FileName) |
| | | //创建存放压缩文件的路径(如果文件夹不存在) |
| | | |
| | | if !dirExists(DesPathName) { |
| | | if !DirExists(DesPathName) { |
| | | os.MkdirAll(DesPathName, 0777) |
| | | } |
| | | logger.Debug("创建文件") |
| | |
| | | // 清理路径字符串 |
| | | src = path.Clean(src) |
| | | // 判断要打包的文件或目录是否存在 |
| | | if !exists(src) { |
| | | if !Exists(src) { |
| | | return errors.New("要打包的文件或目录不存在:" + src) |
| | | } |
| | | // 判断目标文件是否存在 |
| | | if fileExists(dstTar) { |
| | | if FileExists(dstTar) { |
| | | if failIfExist { // 不覆盖已存在的文件 |
| | | return errors.New("目标文件已经存在:" + dstTar) |
| | | } else { // 覆盖已存在的文件 |
| | |
| | | } |
| | | |
| | | // 判断档案是否存在 |
| | | func exists(name string) bool { |
| | | func Exists(name string) bool { |
| | | _, err := os.Stat(name) |
| | | return err == nil || os.IsExist(err) |
| | | } |
| | | |
| | | // 判断文件是否存在 |
| | | func fileExists(filename string) bool { |
| | | func FileExists(filename string) bool { |
| | | fi, err := os.Stat(filename) |
| | | return (err == nil || os.IsExist(err)) && !fi.IsDir() |
| | | } |
| | | |
| | | // 判断目录是否存在 |
| | | func dirExists(dirname string) bool { |
| | | func DirExists(dirname string) bool { |
| | | fi, err := os.Stat(dirname) |
| | | return (err == nil || os.IsExist(err)) && fi.IsDir() |
| | | } |
| | | } |
| | | |
| | | |
| | | //文件夹复制 |
| | | func CopyDir(src string, dest string) { |
| | | src_original := src |
| | | err := filepath.Walk(src, func(src string, f os.FileInfo, err error) error { |
| | | if f == nil { |
| | | return err |
| | | } |
| | | if f.IsDir() { |
| | | CopyDir(f.Name(), dest+"/"+f.Name()) |
| | | } else { |
| | | fmt.Println(src) |
| | | fmt.Println(src_original) |
| | | fmt.Println(dest) |
| | | |
| | | dest_new := strings.Replace(src, src_original, dest, -1) |
| | | fmt.Println(dest_new) |
| | | fmt.Println("CopyFile:" + src + " to " + dest_new) |
| | | CopyFile(src, dest_new) |
| | | } |
| | | return nil |
| | | }) |
| | | if err != nil { |
| | | fmt.Printf("filepath.Walk() returned %v\n", err) |
| | | } |
| | | } |
| | | |
| | | //大文件复制 |
| | | func CopyFile(srcFileName string, dstFileName string) { |
| | | //打开源文件 |
| | | srcFile, err := os.Open(srcFileName) |
| | | if err != nil { |
| | | log.Fatalf("源文件读取失败,原因是:%v\n", err) |
| | | } |
| | | defer func() { |
| | | err = srcFile.Close() |
| | | if err != nil { |
| | | log.Fatalf("源文件关闭失败,原因是:%v\n", err) |
| | | } |
| | | }() |
| | | |
| | | //创建目标文件,稍后会向这个目标文件写入拷贝内容 |
| | | distFile, err := os.Create(dstFileName) |
| | | if err != nil { |
| | | log.Fatalf("目标文件创建失败,原因是:%v\n", err) |
| | | } |
| | | defer func() { |
| | | err = distFile.Close() |
| | | if err != nil { |
| | | log.Fatalf("目标文件关闭失败,原因是:%v\n", err) |
| | | } |
| | | }() |
| | | //定义指定长度的字节切片,每次最多读取指定长度 |
| | | var tmp = make([]byte, 1024*4) |
| | | //循环读取并写入 |
| | | for { |
| | | n, err := srcFile.Read(tmp) |
| | | n, _ = distFile.Write(tmp[:n]) |
| | | if err != nil { |
| | | if err == io.EOF {//读到了文件末尾,并且写入完毕,任务完成返回(关闭文件的操作由defer来完成) |
| | | return |
| | | } else { |
| | | log.Fatalf("拷贝过程中发生错误,错误原因为:%v\n", err) |
| | | } |
| | | } |
| | | } |
| | | } |