This repository has been archived by the owner on Jan 31, 2020. It is now read-only.
/
file.go
115 lines (97 loc) · 1.78 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
104
105
106
107
108
109
110
111
112
113
114
115
package fs
import (
"bytes"
"errors"
"os"
"path/filepath"
"strings"
"time"
)
type FileListing struct {
data []byte
dir string
fi FileInfo
fs *FS
}
type File struct {
*bytes.Reader
*FileListing
}
var (
errNoFS = errors.New("Not connected to an FS")
)
func NewFileListing(name string, size int64, mode os.FileMode, modTime time.Time, data []byte) *FileListing {
dir, file := filepath.Split(name)
if filepath.IsAbs(dir) {
dir = filepath.Clean(dir)
} else {
if abs, err := filepath.Abs(dir); err == nil {
dir = filepath.Clean(abs)
} else {
dir = filepath.Clean(string(filepath.Separator) + abs)[1:]
}
}
dir = filepath.ToSlash(dir)
if strings.HasSuffix(dir, "/") {
dir = dir[:len(dir)-1]
}
if file == "" {
index := strings.LastIndex(dir, "/")
if index > 0 {
file = dir[index+1:]
dir = dir[:index]
}
}
if file == "" {
file = "."
}
return &FileListing{
data: data,
dir: dir,
fi: FileInfo{
name: file,
size: size,
mode: mode,
modTime: modTime,
},
}
}
func (fl *FileListing) Open() File {
return NewFile(fl)
}
func NewFile(fl *FileListing) File {
r := bytes.NewReader(fl.data)
return File{
Reader: r,
FileListing: fl,
}
}
func (f File) Close() error {
_, err := f.Seek(0, 0)
return err
}
func (fl *FileListing) Readdir(count int) (fi []os.FileInfo, err error) {
if fl.fs == nil {
return []os.FileInfo{}, errNoFS
}
if l, ok := fl.fs.getListing(fl.dir); ok {
i := 0
for _, listing := range l.files {
var st os.FileInfo
if st, err = listing.fileListing.Stat(); err == nil {
if count <= 0 || i < count {
fi = append(fi, st)
}
i++
} else {
break
}
}
} else {
err = os.ErrNotExist
}
return
}
func (fl *FileListing) Stat() (os.FileInfo, error) {
return fl.fi, nil
}