mirror of
https://github.com/rclone/rclone
synced 2024-11-11 09:30:44 +01:00
ftp: use path instead of filepath
This commit is contained in:
parent
c13cff37ef
commit
3ed0440bd2
57
ftp/ftp.go
57
ftp/ftp.go
@ -4,7 +4,7 @@ package ftp
|
||||
import (
|
||||
"io"
|
||||
"net/url"
|
||||
"path/filepath"
|
||||
"path"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@ -101,7 +101,7 @@ func ftpConnection(name, root string) (*ftp.ServerConn, *url.URL, error) {
|
||||
if err != nil {
|
||||
return nil, nil, errors.Wrap(err, "open ftp connection url parse")
|
||||
}
|
||||
u.Path = filepath.Join(u.Path, root)
|
||||
u.Path = path.Join(u.Path, root)
|
||||
fs.Debugf(nil, "New ftp Connection with name %s and url %s (path %s)", name, u.String(), u.Path)
|
||||
globalMux.Lock()
|
||||
defer globalMux.Unlock()
|
||||
@ -148,12 +148,15 @@ func NewFs(name, root string) (fs.Fs, error) {
|
||||
func (f *Fs) NewObject(remote string) (fs.Object, error) {
|
||||
fs.Debugf(f, "ENTER function 'NewObject' called with remote %s", remote)
|
||||
defer fs.Debugf(f, "EXIT function 'NewObject'")
|
||||
dir := filepath.Dir(remote)
|
||||
base := filepath.Base(remote)
|
||||
dir := path.Dir(remote)
|
||||
base := path.Base(remote)
|
||||
|
||||
f.mu.Lock()
|
||||
files, _ := f.c.List(dir)
|
||||
files, err := f.c.List(dir)
|
||||
f.mu.Unlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i := range files {
|
||||
if files[i].Name == base {
|
||||
o := &Object{
|
||||
@ -177,11 +180,15 @@ func (f *Fs) list(out fs.ListOpts, dir string, curlevel int) {
|
||||
fs.Debugf(f, "ENTER function 'list'")
|
||||
defer fs.Debugf(f, "EXIT function 'list'")
|
||||
f.mu.Lock()
|
||||
files, _ := f.c.List(filepath.Join(f.root, dir))
|
||||
files, err := f.c.List(path.Join(f.root, dir))
|
||||
f.mu.Unlock()
|
||||
if err != nil {
|
||||
out.SetError(err)
|
||||
return
|
||||
}
|
||||
for i := range files {
|
||||
object := files[i]
|
||||
newremote := filepath.Join(dir, object.Name)
|
||||
newremote := path.Join(dir, object.Name)
|
||||
switch object.Type {
|
||||
case ftp.EntryTypeFolder:
|
||||
if out.IncludeDirectory(newremote) {
|
||||
@ -192,7 +199,7 @@ func (f *Fs) list(out fs.ListOpts, dir string, curlevel int) {
|
||||
Count: -1,
|
||||
}
|
||||
if curlevel < out.Level() {
|
||||
f.list(out, filepath.Join(dir, object.Name), curlevel+1)
|
||||
f.list(out, path.Join(dir, object.Name), curlevel+1)
|
||||
}
|
||||
if out.AddDir(d) {
|
||||
return
|
||||
@ -262,12 +269,16 @@ func (f *Fs) Put(in io.Reader, src fs.ObjectInfo) (fs.Object, error) {
|
||||
func (f *Fs) getInfo(remote string) (*FileInfo, error) {
|
||||
fs.Debugf(f, "ENTER function 'getInfo' on file %s", remote)
|
||||
defer fs.Debugf(f, "EXIT function 'getInfo'")
|
||||
dir := filepath.Dir(remote)
|
||||
base := filepath.Base(remote)
|
||||
dir := path.Dir(remote)
|
||||
base := path.Base(remote)
|
||||
|
||||
f.mu.Lock()
|
||||
files, _ := f.c.List(dir)
|
||||
files, err := f.c.List(dir)
|
||||
f.mu.Unlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for i := range files {
|
||||
if files[i].Name == base {
|
||||
info := &FileInfo{
|
||||
@ -296,12 +307,12 @@ func (f *Fs) mkdir(abspath string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// Mkdir creates the container if it doesn't exist
|
||||
// Mkdir creates the directory if it doesn't exist
|
||||
func (f *Fs) Mkdir(dir string) error {
|
||||
// This actually works as mkdir -p
|
||||
fs.Debugf(f, "ENTER function 'Mkdir' on '%s/%s'", f.root, dir)
|
||||
defer fs.Debugf(f, "EXIT function 'Mkdir' on '%s/%s'", f.root, dir)
|
||||
abspath := filepath.Join(f.root, dir)
|
||||
abspath := path.Join(f.root, dir)
|
||||
tokens := strings.Split(abspath, "/")
|
||||
curdir := ""
|
||||
for i := range tokens {
|
||||
@ -320,21 +331,21 @@ func (f *Fs) Mkdir(dir string) error {
|
||||
func (f *Fs) Rmdir(dir string) error {
|
||||
// This is actually a recursive remove directory
|
||||
f.mu.Lock()
|
||||
files, err := f.c.List(filepath.Join(f.root, dir))
|
||||
files, err := f.c.List(path.Join(f.root, dir))
|
||||
f.mu.Unlock()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "rmdir")
|
||||
}
|
||||
for i := range files {
|
||||
if files[i].Type == ftp.EntryTypeFolder {
|
||||
err = f.Rmdir(filepath.Join(dir, files[i].Name))
|
||||
err = f.Rmdir(path.Join(dir, files[i].Name))
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "rmdir")
|
||||
}
|
||||
}
|
||||
}
|
||||
f.mu.Lock()
|
||||
err = f.c.RemoveDir(filepath.Join(f.root, dir))
|
||||
err = f.c.RemoveDir(path.Join(f.root, dir))
|
||||
f.mu.Unlock()
|
||||
return err
|
||||
}
|
||||
@ -402,7 +413,7 @@ func (f *ftpReadCloser) Close() error {
|
||||
|
||||
// Open an object for read
|
||||
func (o *Object) Open(options ...fs.OpenOption) (io.ReadCloser, error) {
|
||||
path := filepath.Join(o.fs.root, o.remote)
|
||||
path := path.Join(o.fs.root, o.remote)
|
||||
fs.Debugf(o.fs, "ENTER function 'Open' on file '%s' in root '%s'", o.remote, o.fs.root)
|
||||
defer fs.Debugf(o.fs, "EXIT function 'Open' %s", path)
|
||||
c, _, err := ftpConnection(o.fs.name, o.fs.root)
|
||||
@ -418,7 +429,7 @@ func (o *Object) Open(options ...fs.OpenOption) (io.ReadCloser, error) {
|
||||
|
||||
// makeAllDir creates the parent directories for the object
|
||||
func (o *Object) makeAllDir() error {
|
||||
tokens := strings.Split(filepath.Dir(o.remote), "/")
|
||||
tokens := strings.Split(path.Dir(o.remote), "/")
|
||||
dir := ""
|
||||
for i := range tokens {
|
||||
dir += tokens[i] + "/"
|
||||
@ -441,7 +452,7 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo) error {
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "update")
|
||||
}
|
||||
path := filepath.Join(o.fs.root, o.remote)
|
||||
path := path.Join(o.fs.root, o.remote)
|
||||
c, _, err := ftpConnection(o.fs.name, o.fs.root)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "update")
|
||||
@ -459,12 +470,14 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo) error {
|
||||
|
||||
// Remove an object
|
||||
func (o *Object) Remove() error {
|
||||
path := filepath.Join(o.fs.root, o.remote)
|
||||
path := path.Join(o.fs.root, o.remote)
|
||||
fs.Debugf(o, "ENTER function 'Remove' for obejct at %s", path)
|
||||
defer fs.Debugf(o, "EXIT function 'Remove' for obejct at %s", path)
|
||||
// Check if it's a directory or a file
|
||||
info, _ := o.fs.getInfo(path)
|
||||
var err error
|
||||
info, err := o.fs.getInfo(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if info.IsDir {
|
||||
err = o.fs.Rmdir(o.remote)
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user