fix: sftp目录复制斜杠转义导致目录识别不正确
This commit is contained in:
@@ -23,6 +23,13 @@ func (s *SSHClientSFTP) Close() {
|
|||||||
|
|
||||||
// CopyDirRemoteToLocal 复制目录-远程到本地
|
// CopyDirRemoteToLocal 复制目录-远程到本地
|
||||||
func (s *SSHClientSFTP) CopyDirRemoteToLocal(remoteDir, localDir string) error {
|
func (s *SSHClientSFTP) CopyDirRemoteToLocal(remoteDir, localDir string) error {
|
||||||
|
// 创建本地目录
|
||||||
|
err := os.MkdirAll(localDir, 0775)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("CopyDirRemoteToLocal failed to creating local directory %s: => %s", localDir, err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// 列出远程目录中的文件和子目录
|
// 列出远程目录中的文件和子目录
|
||||||
remoteFiles, err := s.Client.ReadDir(remoteDir)
|
remoteFiles, err := s.Client.ReadDir(remoteDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -30,13 +37,6 @@ func (s *SSHClientSFTP) CopyDirRemoteToLocal(remoteDir, localDir string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建本地目录
|
|
||||||
err = os.MkdirAll(localDir, 0775)
|
|
||||||
if err != nil {
|
|
||||||
logger.Errorf("CopyDirRemoteToLocal failed to creating local directory %s: => %s", localDir, err.Error())
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 遍历远程文件和子目录并复制到本地
|
// 遍历远程文件和子目录并复制到本地
|
||||||
for _, remoteFile := range remoteFiles {
|
for _, remoteFile := range remoteFiles {
|
||||||
remotePath := filepath.ToSlash(filepath.Join(remoteDir, remoteFile.Name()))
|
remotePath := filepath.ToSlash(filepath.Join(remoteDir, remoteFile.Name()))
|
||||||
@@ -62,49 +62,26 @@ func (s *SSHClientSFTP) CopyDirRemoteToLocal(remoteDir, localDir string) error {
|
|||||||
|
|
||||||
// CopyDirRemoteToLocal 复制目录-本地到远程
|
// CopyDirRemoteToLocal 复制目录-本地到远程
|
||||||
func (s *SSHClientSFTP) CopyDirLocalToRemote(localDir, remoteDir string) error {
|
func (s *SSHClientSFTP) CopyDirLocalToRemote(localDir, remoteDir string) error {
|
||||||
// 创建远程目录
|
|
||||||
err := s.Client.MkdirAll(remoteDir)
|
|
||||||
if err != nil {
|
|
||||||
logger.Errorf("CopyDirLocalToRemote failed to creating remote directory %s: => %s", remoteDir, err.Error())
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 遍历本地目录中的文件和子目录并复制到远程
|
// 遍历本地目录中的文件和子目录并复制到远程
|
||||||
err = filepath.Walk(localDir, func(localPath string, info os.FileInfo, err error) error {
|
err := filepath.Walk(localDir, func(localPath string, info os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成远程路径
|
// 生成远程路径
|
||||||
remotePath := filepath.Join(remoteDir, localPath[len(localDir):])
|
remotePath := filepath.ToSlash(filepath.Join(remoteDir, localPath[len(localDir):]))
|
||||||
|
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
// 如果是子目录,则创建远程目录
|
// 如果是子目录,则创建远程目录
|
||||||
err := s.Client.MkdirAll(remotePath)
|
if err := s.Client.MkdirAll(remotePath); err != nil {
|
||||||
if err != nil {
|
|
||||||
logger.Errorf("CopyDirLocalToRemote failed to creating remote directory %s: => %s", remotePath, err.Error())
|
logger.Errorf("CopyDirLocalToRemote failed to creating remote directory %s: => %s", remotePath, err.Error())
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 如果是文件,则复制文件内容
|
// 如果是文件,则复制文件内容
|
||||||
localFile, err := os.Open(localPath)
|
if err := s.CopyFileLocalToRemote(localPath, remotePath); err != nil {
|
||||||
if err != nil {
|
logger.Errorf("CopyFileLocalToRemote failed to opening local file %s: => %s", localPath, err.Error())
|
||||||
logger.Errorf("CopyDirLocalToRemote failed to opening local file %s: => %s", localPath, err.Error())
|
return err
|
||||||
return nil
|
|
||||||
}
|
|
||||||
defer localFile.Close()
|
|
||||||
|
|
||||||
remoteFile, err := s.Client.Create(remotePath)
|
|
||||||
if err != nil {
|
|
||||||
logger.Errorf("CopyDirLocalToRemote failed to creating remote file %s: => %s", remotePath, err.Error())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
defer remoteFile.Close()
|
|
||||||
|
|
||||||
_, err = io.Copy(remoteFile, localFile)
|
|
||||||
if err != nil {
|
|
||||||
logger.Errorf("CopyDirLocalToRemote failed to copying file contents from %s to %s: => %s", localPath, remotePath, err.Error())
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,8 +117,7 @@ func (s *SSHClientSFTP) CopyFileRemoteToLocal(remotePath, localPath string) erro
|
|||||||
defer localFile.Close()
|
defer localFile.Close()
|
||||||
|
|
||||||
// 复制文件内容
|
// 复制文件内容
|
||||||
_, err = io.Copy(localFile, remoteFile)
|
if _, err = io.Copy(localFile, remoteFile); err != nil {
|
||||||
if err != nil {
|
|
||||||
logger.Errorf("CopyFileRemoteToLocal failed to copying contents: => %s", err.Error())
|
logger.Errorf("CopyFileRemoteToLocal failed to copying contents: => %s", err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -167,8 +143,7 @@ func (s *SSHClientSFTP) CopyFileLocalToRemote(localPath, remotePath string) erro
|
|||||||
defer remoteFile.Close()
|
defer remoteFile.Close()
|
||||||
|
|
||||||
// 复制文件内容
|
// 复制文件内容
|
||||||
_, err = io.Copy(remoteFile, localFile)
|
if _, err = io.Copy(remoteFile, localFile); err != nil {
|
||||||
if err != nil {
|
|
||||||
logger.Errorf("CopyFileLocalToRemote failed to copying contents: => %s", err.Error())
|
logger.Errorf("CopyFileLocalToRemote failed to copying contents: => %s", err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user