mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-07 14:50:55 +03:00
add DirLister interface
Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
@@ -384,47 +384,65 @@ func (c *scpCommand) handleRecursiveDownload(fs vfs.Fs, dirPath, virtualPath str
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
files, err := fs.ReadDir(dirPath)
|
||||
// dirPath is a fs path, not a virtual path
|
||||
lister, err := fs.ReadDir(dirPath)
|
||||
if err != nil {
|
||||
c.sendErrorMessage(fs, err)
|
||||
return err
|
||||
}
|
||||
files = c.connection.User.FilterListDir(files, fs.GetRelativePath(dirPath))
|
||||
defer lister.Close()
|
||||
|
||||
vdirs := c.connection.User.GetVirtualFoldersInfo(virtualPath)
|
||||
|
||||
var dirs []string
|
||||
for _, file := range files {
|
||||
filePath := fs.GetRelativePath(fs.Join(dirPath, file.Name()))
|
||||
if file.Mode().IsRegular() || file.Mode()&os.ModeSymlink != 0 {
|
||||
err = c.handleDownload(filePath)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
} else if file.IsDir() {
|
||||
dirs = append(dirs, filePath)
|
||||
for {
|
||||
files, err := lister.Next(vfs.ListerBatchSize)
|
||||
finished := errors.Is(err, io.EOF)
|
||||
if err != nil && !finished {
|
||||
c.sendErrorMessage(fs, err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
c.sendErrorMessage(fs, err)
|
||||
return err
|
||||
}
|
||||
for _, dir := range dirs {
|
||||
err = c.handleDownload(dir)
|
||||
if err != nil {
|
||||
files = c.connection.User.FilterListDir(files, fs.GetRelativePath(dirPath))
|
||||
if len(vdirs) > 0 {
|
||||
files = append(files, vdirs...)
|
||||
vdirs = nil
|
||||
}
|
||||
for _, file := range files {
|
||||
filePath := fs.GetRelativePath(fs.Join(dirPath, file.Name()))
|
||||
if file.Mode().IsRegular() || file.Mode()&os.ModeSymlink != 0 {
|
||||
err = c.handleDownload(filePath)
|
||||
if err != nil {
|
||||
c.sendErrorMessage(fs, err)
|
||||
return err
|
||||
}
|
||||
} else if file.IsDir() {
|
||||
dirs = append(dirs, filePath)
|
||||
}
|
||||
}
|
||||
if finished {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
lister.Close()
|
||||
|
||||
return c.downloadDirs(fs, dirs)
|
||||
}
|
||||
err = errors.New("unable to send directory for non recursive copy")
|
||||
c.sendErrorMessage(nil, err)
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *scpCommand) downloadDirs(fs vfs.Fs, dirs []string) error {
|
||||
for _, dir := range dirs {
|
||||
if err := c.handleDownload(dir); err != nil {
|
||||
c.sendErrorMessage(fs, err)
|
||||
return err
|
||||
}
|
||||
err = c.sendProtocolMessage("E\n")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.readConfirmationMessage()
|
||||
}
|
||||
err = fmt.Errorf("unable to send directory for non recursive copy")
|
||||
c.sendErrorMessage(nil, err)
|
||||
return err
|
||||
if err := c.sendProtocolMessage("E\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
return c.readConfirmationMessage()
|
||||
}
|
||||
|
||||
func (c *scpCommand) sendDownloadFileData(fs vfs.Fs, filePath string, stat os.FileInfo, transfer *transfer) error {
|
||||
|
||||
Reference in New Issue
Block a user