From e2b96364e8a652353a000cbe1d295ef604fcc5b7 Mon Sep 17 00:00:00 2001 From: r0n1n7an Date: Mon, 4 Aug 2025 19:27:32 +0800 Subject: [PATCH] support temporary filename suffix while uploading --- ftpsClient.go | 54 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/ftpsClient.go b/ftpsClient.go index b8b2465..d43443b 100644 --- a/ftpsClient.go +++ b/ftpsClient.go @@ -14,27 +14,29 @@ import ( ) var ( - host string = "" - port string = "" - user string = "" - pswd string = "" - loc string = "" - rmt string = "" - act string = "" - retry int = 0 - intrv int = 0 + host string = "" + port string = "" + user string = "" + pswd string = "" + loc string = "" + rmt string = "" + act string = "" + suffix string = "" + retry int = 0 + intrv int = 0 ) var ftp *goftp.FTP func init() { //flag.StringVar(&host, "h", "203.93.100.58", "FTPS Server Address") - flag.StringVar(&host, "h", "10.60.254.52", "FTPS Server Address") + flag.StringVar(&host, "s", "10.60.254.52", "FTPS Server Address") flag.StringVar(&port, "o", "3031", "FTPS Server Port") flag.StringVar(&user, "u", "idte", "Username") flag.StringVar(&pswd, "p", "wistronTE2022", "Password") flag.StringVar(&loc, "L", "./", "Local Path") flag.StringVar(&rmt, "R", "/", "Remote Path") flag.StringVar(&act, "A", "list", "Action: list,upld,dnld") + flag.StringVar(&suffix, "X", ".PENDING", "Temporary filename suffix while uploading") flag.IntVar(&intrv, "I", 10, "Retry Interval (Seconds)") flag.IntVar(&retry, "T", 5, "Retry Times") flag.Parse() @@ -118,14 +120,14 @@ func _List(path string) { func _Download(local, remote string) { log.Printf("[MSG] Downloading: %s\r\n", remote) var err error - base := filepath.Base(remote) + baseRemote := filepath.Base(remote) for i := 0; i <= retry; i++ { if i > 0 { time.Sleep(time.Second * time.Duration(intrv)) log.Printf("[###] Retrying Download %d/%d: %s\r\n", i, retry, remote) } _, err = ftp.Retr(remote, func(rdr io.Reader) error { - wtr, oserr := os.Create(local + base) + wtr, oserr := os.Create(local + baseRemote) if oserr != nil { return oserr } @@ -150,26 +152,46 @@ func _Download(local, remote string) { func _Upload(local, remote string) { log.Printf("[MSG] Uploading: %s\r\n", local) + baseLocal := filepath.Base(local) var err error + if suffix != "" { + err = os.Rename(local, local+suffix) + if err != nil { + log.Printf("[ERR] Rename Local File: %s -> %s; %s\r\n", local, local+suffix, err.Error()) + return + } + } for i := 0; i <= retry; i++ { if i > 0 { time.Sleep(time.Second * time.Duration(intrv)) - log.Printf("[###] Retrying Upload %d/%d: %s\r\n", i, retry, local) + log.Printf("[###] Retrying Upload %d/%d: %s\r\n", i, retry, local+suffix) } err = ftp.Cwd(remote) if err != nil { continue } - err = ftp.Upload(local) + err = ftp.Upload(local + suffix) if err != nil { continue } break } if err != nil { - log.Printf("[***] %s; %s\r\n", remote, local) - log.Printf("[ERR] Upload NG: %s; %s", local, err.Error()) + log.Printf("[***] %s; %s\r\n", remote, local+suffix) + log.Printf("[ERR] Upload NG: %s; %s", local+suffix, err.Error()) return } + if suffix != "" { + err = ftp.Rename(remote+"/"+baseLocal+suffix, remote+"/"+baseLocal) + if err != nil { + log.Printf("[ERR] Rename Remote File: %s --> %s; %s\r\n", remote+"/"+baseLocal+suffix, remote+"/"+baseLocal, err.Error()) + return + } + err = os.Rename(local+suffix, local) + if err != nil { + log.Printf("[ERR] Rename Local File: %s -> %s; %s\r\n", local+suffix, local, err.Error()) + return + } + } log.Printf("[MSG] Upload OK: %s\r\n", local) }