package ftp
import (
"fmt"
"github.com/jlaffaye/ftp"
)
//SourceManager ...
type SourceManager struct {
conn *ftp.ServerConn
}
// EntryHandler 遍历ftp目录时的文件handler
// EntryHandler ...
type EntryHandler func(e *ftp.Entry, currentPath string) error
// Source FTP 文件对象
type Source struct {
// ftp库的entry对象
entry *ftp.Entry
// 文件的全路径+文件名
path string
}
// 遍历ftp目录,获取文件
func (m *SourceManager) walk(rootDir string, handler EntryHandler) error {
entries, err := m.conn.List(rootDir)
if err != nil {
return err
}
for _, entry := range entries {
if entry.Name == "DVRWorkDirectory" {
continue
}
switch entry.Type {
case ftp.EntryTypeFile:
handler(entry, rootDir)
case ftp.EntryTypeFolder:
m.walk(fmt.Sprintf("%s/%s", rootDir, entry.Name), handler)
default:
}
}
return nil
}
func (m *SourceManager) listfiles(rootDir string) ([]*Source, error) {
sources := []*Source{}
err := m.walk(rootDir, func(entry *ftp.Entry, currentPath string) error {
sources = append(sources, &Source{
entry: entry,
path: fmt.Sprintf("%s/%s", currentPath, entry.Name),
})
return nil
})
if err != nil {
return nil, err
}
return sources, nil
}