...
1
16
17 package filesystem
18
19 import (
20 "fmt"
21 "os"
22 "path/filepath"
23 "runtime"
24 "strings"
25 "time"
26 )
27
28
29 type DefaultFs struct {
30 root string
31 }
32
33 var _ Filesystem = &DefaultFs{}
34
35
36 func NewTempFs() Filesystem {
37 path, _ := os.MkdirTemp("", "tmpfs")
38 return &DefaultFs{
39 root: path,
40 }
41 }
42
43 func (fs *DefaultFs) prefix(path string) string {
44 if len(fs.root) == 0 {
45 return path
46 }
47 return filepath.Join(fs.root, path)
48 }
49
50
51 func (fs *DefaultFs) Stat(name string) (os.FileInfo, error) {
52 return os.Stat(fs.prefix(name))
53 }
54
55
56 func (fs *DefaultFs) Create(name string) (File, error) {
57 file, err := os.Create(fs.prefix(name))
58 if err != nil {
59 return nil, err
60 }
61 return &defaultFile{file}, nil
62 }
63
64
65 func (fs *DefaultFs) Rename(oldpath, newpath string) error {
66 if !strings.HasPrefix(oldpath, fs.root) {
67 oldpath = fs.prefix(oldpath)
68 }
69 if !strings.HasPrefix(newpath, fs.root) {
70 newpath = fs.prefix(newpath)
71 }
72 return os.Rename(oldpath, newpath)
73 }
74
75
76 func (fs *DefaultFs) MkdirAll(path string, perm os.FileMode) error {
77 return os.MkdirAll(fs.prefix(path), perm)
78 }
79
80
81
82
83
84
85
86
87
88 func MkdirAllWithPathCheck(path string, perm os.FileMode) error {
89 if dir, err := os.Lstat(path); err == nil {
90
91
92
93 if dir.IsDir() ||
94 (runtime.GOOS == "windows" && (dir.Mode()&os.ModeSymlink != 0)) {
95 return nil
96 }
97 return fmt.Errorf("path %v exists but is not a directory", path)
98 }
99
100 if err := os.MkdirAll(path, perm); err != nil {
101 return err
102 }
103 return nil
104 }
105
106
107 func (fs *DefaultFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
108 return os.Chtimes(fs.prefix(name), atime, mtime)
109 }
110
111
112 func (fs *DefaultFs) RemoveAll(path string) error {
113 return os.RemoveAll(fs.prefix(path))
114 }
115
116
117 func (fs *DefaultFs) Remove(name string) error {
118 return os.Remove(fs.prefix(name))
119 }
120
121
122 func (fs *DefaultFs) ReadFile(filename string) ([]byte, error) {
123 return os.ReadFile(fs.prefix(filename))
124 }
125
126
127 func (fs *DefaultFs) TempDir(dir, prefix string) (string, error) {
128 return os.MkdirTemp(fs.prefix(dir), prefix)
129 }
130
131
132 func (fs *DefaultFs) TempFile(dir, prefix string) (File, error) {
133 file, err := os.CreateTemp(fs.prefix(dir), prefix)
134 if err != nil {
135 return nil, err
136 }
137 return &defaultFile{file}, nil
138 }
139
140
141 func (fs *DefaultFs) ReadDir(dirname string) ([]os.DirEntry, error) {
142 return os.ReadDir(fs.prefix(dirname))
143 }
144
145
146 func (fs *DefaultFs) Walk(root string, walkFn filepath.WalkFunc) error {
147 return filepath.Walk(fs.prefix(root), walkFn)
148 }
149
150
151 type defaultFile struct {
152 file *os.File
153 }
154
155
156 func (file *defaultFile) Name() string {
157 return file.file.Name()
158 }
159
160
161 func (file *defaultFile) Write(b []byte) (n int, err error) {
162 return file.file.Write(b)
163 }
164
165
166 func (file *defaultFile) Sync() error {
167 return file.file.Sync()
168 }
169
170
171 func (file *defaultFile) Close() error {
172 return file.file.Close()
173 }
174
View as plain text