Skip to content

Commit

Permalink
Merge pull request #93 from Mojachieee/master
Browse files Browse the repository at this point in the history
added recursively deleting (non-empty) folders
  • Loading branch information
jlaffaye committed Jun 16, 2017
2 parents 5c7b901 + 479d87b commit 6bccbfb
Show file tree
Hide file tree
Showing 2 changed files with 223 additions and 0 deletions.
188 changes: 188 additions & 0 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,3 +268,191 @@ func TestWrongLogin(t *testing.T) {
t.Fatal("expected error, got nil")
}
}

func TestDeleteDirRecur(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}
c, err := DialTimeout("localhost:21", 5*time.Second)
if err != nil {
t.Fatal(err)
}

err = c.Login("anonymous", "anonymous")
if err != nil {
t.Fatal(err)
}

err = c.NoOp()
if err != nil {
t.Error(err)
}

err = c.ChangeDir("incoming")
if err != nil {
t.Error(err)
}

err = c.MakeDir("testDir")
if err != nil {
t.Error(err)
}

err = c.ChangeDir("testDir")
if err != nil {
t.Error(err)
}

err = c.MakeDir("anotherDir")
if err != nil {
t.Error(err)
}

data := bytes.NewBufferString("test text")
err = c.Stor("fileTest", data)
if err != nil {
t.Error(err)
}

err = c.ChangeDirToParent()
if err != nil {
t.Error(err)
}
err = c.RemoveDirRecur("testDir")
if err != nil {
t.Error(err)
}
dir, err := c.CurrentDir()
if err != nil {
t.Error(err)
} else {
if dir != "/incoming" {
t.Error("Wrong dir: " + dir)
}
}

err = c.ChangeDir("testDir")
if err == nil {
t.Fatal("expected error, got nil")
}

err = c.Logout()
if err != nil {
if protoErr := err.(*textproto.Error); protoErr != nil {
if protoErr.Code != StatusNotImplemented {
t.Error(err)
}
} else {
t.Error(err)
}
}

c.Quit()
}

func TestFileDeleteDirRecur(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}

c, err := DialTimeout("localhost:21", 5*time.Second)
if err != nil {
t.Fatal(err)
}

err = c.Login("anonymous", "anonymous")
if err != nil {
t.Fatal(err)
}

err = c.ChangeDir("incoming")
if err != nil {
t.Error(err)
}

data := bytes.NewBufferString(testData)
err = c.Stor("testFile", data)
if err != nil {
t.Error(err)
}

err = c.RemoveDirRecur("testFile")
if err == nil {
t.Fatal("expected error got nill")
}

dir, err := c.CurrentDir()
if err != nil {
t.Error(err)
} else {
if dir != "/incoming" {
t.Error("Wrong dir: " + dir)
}
}

err = c.Delete("testFile")
if err != nil {
t.Error(err)
}

err = c.Logout()
if err != nil {
if protoErr := err.(*textproto.Error); protoErr != nil {
if protoErr.Code != StatusNotImplemented {
t.Error(err)
}
} else {
t.Error(err)
}
}

c.Quit()
}

func TestMissingFolderDeleteDirRecur(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}

c, err := DialTimeout("localhost:21", 5*time.Second)
if err != nil {
t.Fatal(err)
}

err = c.Login("anonymous", "anonymous")
if err != nil {
t.Fatal(err)
}

err = c.ChangeDir("incoming")
if err != nil {
t.Error(err)
}

err = c.RemoveDirRecur("test")
if err == nil {
t.Fatal("expected error got nill")
}

dir, err := c.CurrentDir()
if err != nil {
t.Error(err)
} else {
if dir != "/incoming" {
t.Error("Wrong dir: " + dir)
}
}

err = c.Logout()
if err != nil {
if protoErr := err.(*textproto.Error); protoErr != nil {
if protoErr.Code != StatusNotImplemented {
t.Error(err)
}
} else {
t.Error(err)
}
}

c.Quit()
}
35 changes: 35 additions & 0 deletions ftp.go
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,41 @@ func (c *ServerConn) Delete(path string) error {
return err
}

// RemoveDirRecur deletes a non-empty folder recursively using
// RemoveDir and Delete
func (c *ServerConn) RemoveDirRecur(path string) error {
err := c.ChangeDir(path)
if err != nil {
return err
}
currentDir, err := c.CurrentDir()
if err != nil {
return err
}
entries, err := c.List(currentDir)
for _, entry := range entries {
if entry.Name != ".." && entry.Name != "." {
if entry.Type == EntryTypeFolder {
err = c.RemoveDirRecur(currentDir + "/" + entry.Name)
if err != nil {
return err
}
} else {
err = c.Delete(entry.Name)
if err != nil {
return err
}
}
}
}
err = c.ChangeDirToParent()
if err != nil {
return err
}
err = c.RemoveDir(currentDir)
return err
}

// MakeDir issues a MKD FTP command to create the specified directory on the
// remote FTP server.
func (c *ServerConn) MakeDir(path string) error {
Expand Down

0 comments on commit 6bccbfb

Please sign in to comment.