1
2
3
4
5
6 package ioutil
7
8 import (
9 "bytes"
10 "io"
11 "os"
12 "sort"
13 )
14
15
16
17 func readAll(r io.Reader, capacity int64) ([]byte, os.Error) {
18 buf := bytes.NewBuffer(make([]byte, 0, capacity))
19 _, err := buf.ReadFrom(r)
20 return buf.Bytes(), err
21 }
22
23
24 func ReadAll(r io.Reader) ([]byte, os.Error) {
25 return readAll(r, bytes.MinRead)
26 }
27
28
29 func ReadFile(filename string) ([]byte, os.Error) {
30 f, err := os.Open(filename)
31 if err != nil {
32 return nil, err
33 }
34 defer f.Close()
35
36
37 fi, err := f.Stat()
38 var n int64
39 if err == nil && fi.Size < 2e9 {
40 n = fi.Size
41 }
42
43
44
45
46
47 return readAll(f, n+bytes.MinRead)
48 }
49
50
51
52
53 func WriteFile(filename string, data []byte, perm uint32) os.Error {
54 f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
55 if err != nil {
56 return err
57 }
58 n, err := f.Write(data)
59 f.Close()
60 if err == nil && n < len(data) {
61 err = io.ErrShortWrite
62 }
63 return err
64 }
65
66
67 type fileInfoList []*os.FileInfo
68
69 func (f fileInfoList) Len() int { return len(f) }
70 func (f fileInfoList) Less(i, j int) bool { return f[i].Name < f[j].Name }
71 func (f fileInfoList) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
72
73
74
75 func ReadDir(dirname string) ([]*os.FileInfo, os.Error) {
76 f, err := os.Open(dirname)
77 if err != nil {
78 return nil, err
79 }
80 list, err := f.Readdir(-1)
81 f.Close()
82 if err != nil {
83 return nil, err
84 }
85 fi := make(fileInfoList, len(list))
86 for i := range list {
87 fi[i] = &list[i]
88 }
89 sort.Sort(fi)
90 return fi, nil
91 }
92
93 type nopCloser struct {
94 io.Reader
95 }
96
97 func (nopCloser) Close() os.Error { return nil }
98
99
100
101 func NopCloser(r io.Reader) io.ReadCloser {
102 return nopCloser{r}
103 }
104
105 type devNull int
106
107 func (devNull) Write(p []byte) (int, os.Error) {
108 return len(p), nil
109 }
110
111 var blackHole = make([]byte, 8192)
112
113 func (devNull) ReadFrom(r io.Reader) (n int64, err os.Error) {
114 readSize := 0
115 for {
116 readSize, err = r.Read(blackHole)
117 n += int64(readSize)
118 if err != nil {
119 if err == os.EOF {
120 return n, nil
121 }
122 return
123 }
124 }
125 panic("unreachable")
126 }
127
128
129
130 var Discard io.Writer = devNull(0)