-
Notifications
You must be signed in to change notification settings - Fork 2
/
file.go
103 lines (89 loc) · 1.72 KB
/
file.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package main
import (
"io/ioutil"
"log"
"os"
"path"
"strings"
"time"
)
type FInfo struct {
Name string
Size int64
Mode os.FileMode
ModTime time.Time
Content []byte
}
type Dir interface {
Path(name string) string
Log(str string)
List() ([]FInfo, error)
Read(f *FInfo) error
Write(f FInfo) error
Remove(name string) error
}
type FSDir struct {
name string
logger *log.Logger
}
func NewFInfo(fi os.FileInfo) FInfo {
return FInfo{
Name: fi.Name(),
Size: fi.Size(),
Mode: fi.Mode(),
ModTime: fi.ModTime(),
}
}
func ListFiles(base string, fis []os.FileInfo, callback func(os.FileInfo)) {
for _, fi := range fis {
if fi.Mode()&os.ModeSymlink != 0 {
li, err := os.Stat(path.Join(base, fi.Name()))
if err == nil {
fi = li
}
}
if !strings.HasPrefix(fi.Name(), ".") {
callback(fi)
}
}
}
func (dir FSDir) Path(name string) string {
return path.Join(dir.name, name)
}
func (dir FSDir) Log(str string) {
if dir.logger != nil {
dir.logger.Println(str)
}
}
func (dir FSDir) List() ([]FInfo, error) {
fis, err := ioutil.ReadDir(dir.name)
if err != nil {
return nil, err
}
fs := []FInfo{}
ListFiles(dir.name, fis, func(fi os.FileInfo) {
if fi.Mode().IsRegular() {
fs = append(fs, NewFInfo(fi))
}
})
return fs, nil
}
func (dir FSDir) Read(f *FInfo) error {
r, err := os.Open(dir.Path(f.Name))
if err != nil {
return err
}
defer r.Close()
f.Content, err = ioutil.ReadAll(r)
return err
}
func (dir FSDir) Write(f FInfo) error {
err := ioutil.WriteFile(dir.Path(f.Name), f.Content, 0644)
if err == nil {
err = os.Chtimes(dir.Path(f.Name), f.ModTime, f.ModTime)
}
return err
}
func (dir FSDir) Remove(name string) error {
return os.Remove(dir.Path(name))
}