1
2
3
4
5 package os
6
7
8
9
10
11
12
13
14 func MkdirAll(path string, perm uint32) Error {
15
16 dir, err := Stat(path)
17 if err == nil {
18 if dir.IsDirectory() {
19 return nil
20 }
21 return &PathError{"mkdir", path, ENOTDIR}
22 }
23
24
25 i := len(path)
26 for i > 0 && IsPathSeparator(path[i-1]) {
27 i--
28 }
29
30 j := i
31 for j > 0 && !IsPathSeparator(path[j-1]) {
32 j--
33 }
34
35 if j > 1 {
36
37 err = MkdirAll(path[0:j-1], perm)
38 if err != nil {
39 return err
40 }
41 }
42
43
44 err = Mkdir(path, perm)
45 if err != nil {
46
47
48 dir, err1 := Lstat(path)
49 if err1 == nil && dir.IsDirectory() {
50 return nil
51 }
52 return err
53 }
54 return nil
55 }
56
57
58
59
60
61 func RemoveAll(path string) Error {
62
63 err := Remove(path)
64 if err == nil {
65 return nil
66 }
67
68
69 dir, serr := Lstat(path)
70 if serr != nil {
71 if serr, ok := serr.(*PathError); ok && serr.Error == ENOENT {
72 return nil
73 }
74 return serr
75 }
76 if !dir.IsDirectory() {
77
78 return err
79 }
80
81
82 fd, err := Open(path)
83 if err != nil {
84 return err
85 }
86
87
88 err = nil
89 for {
90 names, err1 := fd.Readdirnames(100)
91 for _, name := range names {
92 err1 := RemoveAll(path + string(PathSeparator) + name)
93 if err == nil {
94 err = err1
95 }
96 }
97 if err1 == EOF {
98 break
99 }
100
101 if err == nil {
102 err = err1
103 }
104 if len(names) == 0 {
105 break
106 }
107 }
108
109
110 fd.Close()
111
112
113 err1 := Remove(path)
114 if err == nil {
115 err = err1
116 }
117 return err
118 }