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  }