github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/third/kmgQiniu/download.go (about) 1 package kmgQiniu 2 3 import ( 4 "os" 5 "path/filepath" 6 7 "github.com/bronze1man/kmg/kmgErr" 8 "github.com/bronze1man/kmg/kmgFile" 9 "github.com/bronze1man/kmg/kmgTask" 10 ) 11 12 var Download = DownloadDir 13 14 //下载单个文件,到本地,会覆盖本地已经存在的文件,会创建所有父级目录,会使用hash检查文件是否存在. 15 // @deprecated 16 func DownloadFileWithHash(ctx *Context, remotePath string, localPath string, hash string) (err error) { 17 fhash, err := ComputeHashFromFile(localPath) 18 if err == nil && fhash == hash { 19 return 20 } 21 if err != nil && !os.IsNotExist(err) { 22 kmgErr.LogErrorWithStack(err) 23 return 24 } 25 if fhash == hash { 26 return 27 } 28 return DownloadFile(ctx, remotePath, localPath) 29 } 30 31 // @deprecated 32 // TODO 这个会多建一个空目录,这个算安全隐患. 33 func DownloadFile(ctx *Context, remotePath string, localPath string) (err error) { 34 err = kmgFile.MkdirForFile(localPath) 35 if err != nil { 36 kmgErr.LogErrorWithStack(err) 37 return 38 } 39 f, err := os.Create(localPath) 40 if err != nil { 41 kmgErr.LogErrorWithStack(err) 42 return 43 } 44 defer f.Close() 45 return ctx.DownloadToWriter(remotePath, f) 46 } 47 48 // @deprecated 49 func DownloadDir(ctx *Context, remoteRoot string, localRoot string) (err error) { 50 entries, err := ListPrefix(ctx, remoteRoot) 51 if err != nil { 52 kmgErr.LogErrorWithStack(err) 53 return err 54 } 55 if len(entries) == 0 { 56 return ErrNoFile 57 } 58 // TODO 多线程提高性能. 59 tm := kmgTask.NewLimitThreadErrorHandleTaskManager(ThreadNum, 3) 60 defer tm.Close() 61 for _, entry := range entries { 62 entry := entry 63 refPath, err := filepath.Rel(remoteRoot, entry.Key) 64 if err != nil { 65 kmgErr.LogErrorWithStack(err) 66 return err 67 } 68 tm.AddTask(func() (err error) { 69 err = DownloadFileWithHash(ctx, entry.Key, filepath.Join(localRoot, refPath), entry.Hash) 70 return err 71 }) 72 } 73 tm.Wait() 74 return nil 75 }