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