Add trash: deleted files go to trash, restore or empty
This commit is contained in:
+49
-2
@@ -1,6 +1,7 @@
|
||||
package files
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
@@ -54,13 +55,56 @@ func CreateFolder(dataDir, userID, relPath string) error {
|
||||
return os.MkdirAll(p, 0755)
|
||||
}
|
||||
|
||||
// DeleteFile removes a file or folder for a user.
|
||||
// DeleteFile moves a file or folder to trash.
|
||||
func DeleteFile(dataDir, userID, relPath string) error {
|
||||
p := safePath(dataDir, userID, relPath)
|
||||
if p == "" {
|
||||
return os.ErrPermission
|
||||
}
|
||||
return os.RemoveAll(p)
|
||||
trashDir := filepath.Join(UserDir(dataDir, userID), ".trash")
|
||||
if err := os.MkdirAll(trashDir, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
dest := filepath.Join(trashDir, filepath.Base(relPath))
|
||||
// If already exists in trash, add timestamp
|
||||
if _, err := os.Stat(dest); err == nil {
|
||||
dest = dest + "." + fmt.Sprintf("%d", os.Getpid())
|
||||
}
|
||||
return os.Rename(p, dest)
|
||||
}
|
||||
|
||||
// ListTrash returns files in the user's trash.
|
||||
func ListTrash(dataDir, userID string) ([]FileInfo, error) {
|
||||
trashDir := filepath.Join(UserDir(dataDir, userID), ".trash")
|
||||
if err := os.MkdirAll(trashDir, 0755); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
entries, err := os.ReadDir(trashDir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var result []FileInfo
|
||||
for _, e := range entries {
|
||||
result = append(result, FileInfo{Name: e.Name(), Path: e.Name(), IsDir: e.IsDir()})
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// RestoreFromTrash moves a file from trash back to the user's root.
|
||||
func RestoreFromTrash(dataDir, userID, name string) error {
|
||||
trashDir := filepath.Join(UserDir(dataDir, userID), ".trash")
|
||||
src := filepath.Join(trashDir, name)
|
||||
dest := filepath.Join(UserDir(dataDir, userID), name)
|
||||
if strings.Contains(name, "..") {
|
||||
return os.ErrPermission
|
||||
}
|
||||
return os.Rename(src, dest)
|
||||
}
|
||||
|
||||
// EmptyTrash permanently deletes all files in trash.
|
||||
func EmptyTrash(dataDir, userID string) error {
|
||||
trashDir := filepath.Join(UserDir(dataDir, userID), ".trash")
|
||||
return os.RemoveAll(trashDir)
|
||||
}
|
||||
|
||||
// MoveFile moves a file or folder to a new path.
|
||||
@@ -93,6 +137,9 @@ func listDir(base, rel string) ([]FileInfo, error) {
|
||||
}
|
||||
var result []FileInfo
|
||||
for _, e := range entries {
|
||||
if e.Name() == ".trash" || e.Name() == ".git" {
|
||||
continue
|
||||
}
|
||||
entryRel := filepath.Join(rel, e.Name())
|
||||
info := FileInfo{
|
||||
Name: e.Name(),
|
||||
|
||||
Reference in New Issue
Block a user