From 9c617465bde9b36c9cc1c514c204ff0dfbb90c6d Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 25 Mar 2024 18:59:05 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=94=AF=E6=8C=81=20?= =?UTF-8?q?WinSCP=20=E7=9A=84=E7=9B=AE=E5=BD=95=E6=96=87=E4=BB=B6=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/handler/sftp.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/handler/sftp.go b/pkg/handler/sftp.go index f03054e1..8f5354c5 100644 --- a/pkg/handler/sftp.go +++ b/pkg/handler/sftp.go @@ -117,7 +117,8 @@ func (s *SftpHandler) Fileread(r *sftp.Request) (io.ReaderAt, error) { s.recorder.FinishFTPFile(f.FTPLog.ID) }() - return f, err + // 包裹一层,兼容 WinSCP 目录的批量下载 + return NewReaderAt(f), err } func (s *SftpHandler) Close() { @@ -142,6 +143,10 @@ func NewWriterAt(f *srvconn.SftpFile, recorder *proxy.FTPFileRecorder) io.Writer return &clientReadWritAt{f: f, mu: new(sync.RWMutex), recorder: recorder} } +func NewReaderAt(f *srvconn.SftpFile) io.ReaderAt { + return &clientReadWritAt{f: f, mu: new(sync.RWMutex)} +} + type clientReadWritAt struct { f *srvconn.SftpFile mu *sync.RWMutex @@ -159,6 +164,12 @@ func (c *clientReadWritAt) WriteAt(p []byte, off int64) (n int, err error) { return c.f.Write(p) } +func (c *clientReadWritAt) ReadAt(p []byte, off int64) (n int, err error) { + c.mu.Lock() + defer c.mu.Unlock() + return c.f.ReadAt(p, off) +} + type wrapperSFTPFileInfo struct { f os.FileInfo }