gitee.com/h79/goutils@v1.22.10/common/ssh/filepath.go (about)

     1  package ssh
     2  
     3  import (
     4  	"gitee.com/h79/goutils/common/file"
     5  	"io"
     6  	"os"
     7  	"path"
     8  )
     9  
    10  type Path struct {
    11  	Mode  os.FileMode
    12  	Name  string
    13  	IsDir bool
    14  }
    15  
    16  type FileInfo struct {
    17  	Name string
    18  	Size int64
    19  	Mode os.FileMode
    20  }
    21  
    22  func (fi *FileInfo) Receive(opt *Option, src io.Reader) error {
    23  	dst, err := fi.CreateFile(opt)
    24  	if err != nil {
    25  		return err
    26  	}
    27  	defer dst.Close()
    28  
    29  	n, err := file.CopyN(dst, src, fi.Size)
    30  	if err != nil {
    31  		return err
    32  	}
    33  	if n != fi.Size {
    34  		return ErrCopy
    35  	}
    36  	return nil
    37  }
    38  
    39  func (fi *FileInfo) CreateFile(opt *Option) (io.WriteCloser, error) {
    40  
    41  	// Create a local file to write to
    42  	dst, err := os.OpenFile(localFile(opt), os.O_RDWR|os.O_CREATE, opt.Local.Mode|fi.Mode)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  	return dst, nil
    47  }
    48  
    49  func remoteFile(opt *Option) string {
    50  	if opt.Remote.IsDir {
    51  		filename := path.Base(opt.Local.Name)
    52  		opt.Remote.Name = path.Join(opt.Remote.Name, filename)
    53  		opt.Remote.IsDir = false
    54  		return filename
    55  	}
    56  	return path.Base(opt.Remote.Name)
    57  }
    58  
    59  func localFile(opt *Option) string {
    60  	if opt.Local.IsDir {
    61  		filename := path.Base(opt.Remote.Name)
    62  		opt.Local.Name = path.Join(opt.Local.Name, filename)
    63  		opt.Local.IsDir = false
    64  	}
    65  	return opt.Local.Name
    66  }