Skip to content

Commit d9871ea

Browse files
committed
utils: WriteFile function
1 parent dc2c24b commit d9871ea

File tree

2 files changed

+100
-73
lines changed

2 files changed

+100
-73
lines changed

fs.go

Lines changed: 0 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -71,76 +71,3 @@ func (f *BaseFile) IsClosed() bool {
7171
type removerAll interface {
7272
RemoveAll(string) error
7373
}
74-
75-
// RemoveAll removes path and any children it contains.
76-
// It removes everything it can but returns the first error
77-
// it encounters. If the path does not exist, RemoveAll
78-
// returns nil (no error).
79-
func RemoveAll(fs Filesystem, path string) error {
80-
r, ok := fs.(removerAll)
81-
if ok {
82-
return r.RemoveAll(path)
83-
}
84-
85-
return removeAll(fs, path)
86-
}
87-
88-
func removeAll(fs Filesystem, path string) error {
89-
// This implementation is adapted from os.RemoveAll.
90-
91-
// Simple case: if Remove works, we're done.
92-
err := fs.Remove(path)
93-
if err == nil || os.IsNotExist(err) {
94-
return nil
95-
}
96-
97-
// Otherwise, is this a directory we need to recurse into?
98-
dir, serr := fs.Stat(path)
99-
if serr != nil {
100-
if os.IsNotExist(serr) {
101-
return nil
102-
}
103-
104-
return serr
105-
}
106-
107-
if !dir.IsDir() {
108-
// Not a directory; return the error from Remove.
109-
return err
110-
}
111-
112-
// Directory.
113-
fis, err := fs.ReadDir(path)
114-
if err != nil {
115-
if os.IsNotExist(err) {
116-
// Race. It was deleted between the Lstat and Open.
117-
// Return nil per RemoveAll's docs.
118-
return nil
119-
}
120-
121-
return err
122-
}
123-
124-
// Remove contents & return first error.
125-
err = nil
126-
for _, fi := range fis {
127-
cpath := fs.Join(path, fi.Name())
128-
err1 := removeAll(fs, cpath)
129-
if err == nil {
130-
err = err1
131-
}
132-
}
133-
134-
// Remove directory.
135-
err1 := fs.Remove(path)
136-
if err1 == nil || os.IsNotExist(err1) {
137-
return nil
138-
}
139-
140-
if err == nil {
141-
err = err1
142-
}
143-
144-
return err
145-
146-
}

utils.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package billy
2+
3+
import (
4+
"io"
5+
"os"
6+
)
7+
8+
// RemoveAll removes path and any children it contains.
9+
// It removes everything it can but returns the first error
10+
// it encounters. If the path does not exist, RemoveAll
11+
// returns nil (no error).
12+
func RemoveAll(fs Filesystem, path string) error {
13+
r, ok := fs.(removerAll)
14+
if ok {
15+
return r.RemoveAll(path)
16+
}
17+
18+
return removeAll(fs, path)
19+
}
20+
21+
func removeAll(fs Filesystem, path string) error {
22+
// This implementation is adapted from os.RemoveAll.
23+
24+
// Simple case: if Remove works, we're done.
25+
err := fs.Remove(path)
26+
if err == nil || os.IsNotExist(err) {
27+
return nil
28+
}
29+
30+
// Otherwise, is this a directory we need to recurse into?
31+
dir, serr := fs.Stat(path)
32+
if serr != nil {
33+
if os.IsNotExist(serr) {
34+
return nil
35+
}
36+
37+
return serr
38+
}
39+
40+
if !dir.IsDir() {
41+
// Not a directory; return the error from Remove.
42+
return err
43+
}
44+
45+
// Directory.
46+
fis, err := fs.ReadDir(path)
47+
if err != nil {
48+
if os.IsNotExist(err) {
49+
// Race. It was deleted between the Lstat and Open.
50+
// Return nil per RemoveAll's docs.
51+
return nil
52+
}
53+
54+
return err
55+
}
56+
57+
// Remove contents & return first error.
58+
err = nil
59+
for _, fi := range fis {
60+
cpath := fs.Join(path, fi.Name())
61+
err1 := removeAll(fs, cpath)
62+
if err == nil {
63+
err = err1
64+
}
65+
}
66+
67+
// Remove directory.
68+
err1 := fs.Remove(path)
69+
if err1 == nil || os.IsNotExist(err1) {
70+
return nil
71+
}
72+
73+
if err == nil {
74+
err = err1
75+
}
76+
77+
return err
78+
79+
}
80+
81+
// WriteFile writes data to a file named by filename in the given filesystem.
82+
// If the file does not exist, WriteFile creates it with permissions perm;
83+
// otherwise WriteFile truncates it before writing.
84+
func WriteFile(fs Filesystem, filename string, data []byte, perm os.FileMode) error {
85+
f, err := fs.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
86+
if err != nil {
87+
return err
88+
}
89+
90+
n, err := f.Write(data)
91+
if err == nil && n < len(data) {
92+
err = io.ErrShortWrite
93+
}
94+
95+
if err1 := f.Close(); err == nil {
96+
err = err1
97+
}
98+
99+
return err
100+
}

0 commit comments

Comments
 (0)