Skip to content

Commit ffdb198

Browse files
committed
feat(local): basic function of driver
1 parent 3a1fcbe commit ffdb198

2 files changed

Lines changed: 153 additions & 18 deletions

File tree

drivers/local/driver.go

Lines changed: 86 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ package local
22

33
import (
44
"context"
5+
"github.com/alist-org/alist/v3/internal/errs"
6+
"io"
7+
"io/ioutil"
8+
"os"
9+
"path/filepath"
10+
"strings"
511

612
"github.com/alist-org/alist/v3/internal/driver"
713
"github.com/alist-org/alist/v3/internal/model"
@@ -44,48 +50,110 @@ func (d *Driver) GetAddition() driver.Additional {
4450
}
4551

4652
func (d *Driver) List(ctx context.Context, dir model.Obj) ([]model.Obj, error) {
47-
//TODO implement me
48-
panic("implement me")
53+
fullPath := dir.GetID()
54+
rawFiles, err := ioutil.ReadDir(fullPath)
55+
if err != nil {
56+
return nil, errors.Wrapf(err, "error while read dir %s", fullPath)
57+
}
58+
var files []model.Obj
59+
for _, f := range rawFiles {
60+
if strings.HasPrefix(f.Name(), ".") {
61+
continue
62+
}
63+
file := model.Object{
64+
Name: f.Name(),
65+
Modified: f.ModTime(),
66+
Size: f.Size(),
67+
IsFolder: f.IsDir(),
68+
}
69+
files = append(files, &file)
70+
}
71+
return files, nil
4972
}
5073

5174
func (d *Driver) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
52-
//TODO implement me
53-
panic("implement me")
75+
fullPath := file.GetID()
76+
link := model.Link{
77+
FilePath: &fullPath,
78+
}
79+
return &link, nil
5480
}
5581

5682
func (d *Driver) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
57-
//TODO implement me
58-
panic("implement me")
83+
fullPath := filepath.Join(parentDir.GetID(), dirName)
84+
err := os.MkdirAll(fullPath, 0700)
85+
if err != nil {
86+
return errors.Wrapf(err, "error while make dir %s", fullPath)
87+
}
88+
return nil
5989
}
6090

6191
func (d *Driver) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
62-
//TODO implement me
63-
panic("implement me")
92+
srcPath := srcObj.GetID()
93+
dstPath := filepath.Join(dstDir.GetID(), srcObj.GetName())
94+
err := os.Rename(srcPath, dstPath)
95+
if err != nil {
96+
return errors.Wrapf(err, "error while move %s to %s", srcPath, dstPath)
97+
}
98+
return nil
6499
}
65100

66101
func (d *Driver) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
67-
//TODO implement me
68-
panic("implement me")
102+
srcPath := srcObj.GetID()
103+
dstPath := filepath.Join(filepath.Dir(srcPath), newName)
104+
err := os.Rename(srcPath, dstPath)
105+
if err != nil {
106+
return errors.Wrapf(err, "error while rename %s to %s", srcPath, dstPath)
107+
}
108+
return nil
69109
}
70110

71111
func (d *Driver) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
72-
//TODO implement me
73-
panic("implement me")
112+
srcPath := srcObj.GetID()
113+
dstPath := filepath.Join(dstDir.GetID(), srcObj.GetName())
114+
var err error
115+
if srcObj.IsDir() {
116+
err = copyDir(srcPath, dstPath)
117+
} else {
118+
err = copyFile(srcPath, dstPath)
119+
}
120+
if err != nil {
121+
return errors.Wrapf(err, "error while copy %s to %s", srcPath, dstPath)
122+
}
123+
return nil
74124
}
75125

76126
func (d *Driver) Remove(ctx context.Context, obj model.Obj) error {
77-
//TODO implement me
78-
panic("implement me")
127+
var err error
128+
if obj.IsDir() {
129+
err = os.RemoveAll(obj.GetID())
130+
} else {
131+
err = os.Remove(obj.GetID())
132+
}
133+
if err != nil {
134+
return errors.Wrapf(err, "error while remove %s", obj.GetID())
135+
}
136+
return nil
79137
}
80138

81139
func (d *Driver) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
82-
//TODO implement me
83-
panic("implement me")
140+
fullPath := filepath.Join(dstDir.GetID(), stream.GetName())
141+
out, err := os.Create(fullPath)
142+
if err != nil {
143+
return errors.Wrapf(err, "error while create file %s", fullPath)
144+
}
145+
defer func() {
146+
_ = out.Close()
147+
}()
148+
_, err = io.Copy(out, stream)
149+
if err != nil {
150+
return errors.Wrapf(err, "error while copy file %s", fullPath)
151+
}
152+
return nil
84153
}
85154

86155
func (d Driver) Other(ctx context.Context, data interface{}) (interface{}, error) {
87-
//TODO implement me
88-
panic("implement me")
156+
return nil, errs.NotSupport
89157
}
90158

91159
var _ driver.Driver = (*Driver)(nil)

drivers/local/util.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package local
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"io/ioutil"
7+
"os"
8+
"path"
9+
)
10+
11+
// copyFile File copies a single file from src to dst
12+
func copyFile(src, dst string) error {
13+
var err error
14+
var srcfd *os.File
15+
var dstfd *os.File
16+
var srcinfo os.FileInfo
17+
18+
if srcfd, err = os.Open(src); err != nil {
19+
return err
20+
}
21+
defer srcfd.Close()
22+
23+
if dstfd, err = os.Create(dst); err != nil {
24+
return err
25+
}
26+
defer dstfd.Close()
27+
28+
if _, err = io.Copy(dstfd, srcfd); err != nil {
29+
return err
30+
}
31+
if srcinfo, err = os.Stat(src); err != nil {
32+
return err
33+
}
34+
return os.Chmod(dst, srcinfo.Mode())
35+
}
36+
37+
// copyDir Dir copies a whole directory recursively
38+
func copyDir(src string, dst string) error {
39+
var err error
40+
var fds []os.FileInfo
41+
var srcinfo os.FileInfo
42+
43+
if srcinfo, err = os.Stat(src); err != nil {
44+
return err
45+
}
46+
if err = os.MkdirAll(dst, srcinfo.Mode()); err != nil {
47+
return err
48+
}
49+
if fds, err = ioutil.ReadDir(src); err != nil {
50+
return err
51+
}
52+
for _, fd := range fds {
53+
srcfp := path.Join(src, fd.Name())
54+
dstfp := path.Join(dst, fd.Name())
55+
56+
if fd.IsDir() {
57+
if err = copyDir(srcfp, dstfp); err != nil {
58+
fmt.Println(err)
59+
}
60+
} else {
61+
if err = copyFile(srcfp, dstfp); err != nil {
62+
fmt.Println(err)
63+
}
64+
}
65+
}
66+
return nil
67+
}

0 commit comments

Comments
 (0)