Source file
src/io/ioutil/ioutil.go
1
2
3
4
5
6 package ioutil
7
8 import (
9 "bytes"
10 "io"
11 "os"
12 "sort"
13 "sync"
14 )
15
16
17
18 func readAll(r io.Reader, capacity int64) (b []byte, err error) {
19 var buf bytes.Buffer
20
21
22 defer func() {
23 e := recover()
24 if e == nil {
25 return
26 }
27 if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge {
28 err = panicErr
29 } else {
30 panic(e)
31 }
32 }()
33 if int64(int(capacity)) == capacity {
34 buf.Grow(int(capacity))
35 }
36 _, err = buf.ReadFrom(r)
37 return buf.Bytes(), err
38 }
39
40
41
42
43
44 func ReadAll(r io.Reader) ([]byte, error) {
45 return readAll(r, bytes.MinRead)
46 }
47
48
49
50
51
52 func ReadFile(filename string) ([]byte, error) {
53 f, err := os.Open(filename)
54 if err != nil {
55 return nil, err
56 }
57 defer f.Close()
58
59
60 var n int64 = bytes.MinRead
61
62 if fi, err := f.Stat(); err == nil {
63
64
65
66
67
68
69 if size := fi.Size() + bytes.MinRead; size > n {
70 n = size
71 }
72 }
73 return readAll(f, n)
74 }
75
76
77
78
79 func WriteFile(filename string, data []byte, perm os.FileMode) error {
80 f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
81 if err != nil {
82 return err
83 }
84 _, err = f.Write(data)
85 if err1 := f.Close(); err == nil {
86 err = err1
87 }
88 return err
89 }
90
91
92
93 func ReadDir(dirname string) ([]os.FileInfo, error) {
94 f, err := os.Open(dirname)
95 if err != nil {
96 return nil, err
97 }
98 list, err := f.Readdir(-1)
99 f.Close()
100 if err != nil {
101 return nil, err
102 }
103 sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
104 return list, nil
105 }
106
107 type nopCloser struct {
108 io.Reader
109 }
110
111 func (nopCloser) Close() error { return nil }
112
113
114
115 func NopCloser(r io.Reader) io.ReadCloser {
116 return nopCloser{r}
117 }
118
119 type devNull int
120
121
122
123 var _ io.ReaderFrom = devNull(0)
124
125 func (devNull) Write(p []byte) (int, error) {
126 return len(p), nil
127 }
128
129 func (devNull) WriteString(s string) (int, error) {
130 return len(s), nil
131 }
132
133 var blackHolePool = sync.Pool{
134 New: func() interface{} {
135 b := make([]byte, 8192)
136 return &b
137 },
138 }
139
140 func (devNull) ReadFrom(r io.Reader) (n int64, err error) {
141 bufp := blackHolePool.Get().(*[]byte)
142 readSize := 0
143 for {
144 readSize, err = r.Read(*bufp)
145 n += int64(readSize)
146 if err != nil {
147 blackHolePool.Put(bufp)
148 if err == io.EOF {
149 return n, nil
150 }
151 return
152 }
153 }
154 }
155
156
157
158 var Discard io.Writer = devNull(0)
159
View as plain text