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 }