Source file
src/os/removeall_noat.go
1
2
3
4
5
6
7 package os
8
9 import (
10 "io"
11 "runtime"
12 "syscall"
13 )
14
15 func removeAll(path string) error {
16 if path == "" {
17
18
19 return nil
20 }
21
22
23
24 for len(path) > 1 && IsPathSeparator(path[len(path)-1]) {
25 path = path[:len(path)-1]
26 }
27
28
29
30
31 if endsWithDot(path) {
32 return &PathError{Op: "RemoveAll", Path: path, Err: syscall.EINVAL}
33 }
34
35
36 err := Remove(path)
37 if err == nil || IsNotExist(err) {
38 return nil
39 }
40
41
42 dir, serr := Lstat(path)
43 if serr != nil {
44 if serr, ok := serr.(*PathError); ok && (IsNotExist(serr.Err) || serr.Err == syscall.ENOTDIR) {
45 return nil
46 }
47 return serr
48 }
49 if !dir.IsDir() {
50
51 return err
52 }
53
54
55 err = nil
56 for {
57 fd, err := Open(path)
58 if err != nil {
59 if IsNotExist(err) {
60
61 return nil
62 }
63 return err
64 }
65
66 const reqSize = 1024
67 var names []string
68 var readErr error
69
70 for {
71 numErr := 0
72 names, readErr = fd.Readdirnames(reqSize)
73
74 for _, name := range names {
75 err1 := RemoveAll(path + string(PathSeparator) + name)
76 if err == nil {
77 err = err1
78 }
79 if err1 != nil {
80 numErr++
81 }
82 }
83
84
85
86 if numErr != reqSize {
87 break
88 }
89 }
90
91
92
93
94
95
96 fd.Close()
97
98 if readErr == io.EOF {
99 break
100 }
101
102 if err == nil {
103 err = readErr
104 }
105 if len(names) == 0 {
106 break
107 }
108
109
110
111
112
113 if len(names) < reqSize {
114 err1 := Remove(path)
115 if err1 == nil || IsNotExist(err1) {
116 return nil
117 }
118
119 if err != nil {
120
121
122
123
124
125
126
127 return err
128 }
129 }
130 }
131
132
133 err1 := Remove(path)
134 if err1 == nil || IsNotExist(err1) {
135 return nil
136 }
137 if runtime.GOOS == "windows" && IsPermission(err1) {
138 if fs, err := Stat(path); err == nil {
139 if err = Chmod(path, FileMode(0200|int(fs.Mode()))); err == nil {
140 err1 = Remove(path)
141 }
142 }
143 }
144 if err == nil {
145 err = err1
146 }
147 return err
148 }
149
View as plain text