1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Package ioutil implements some I/O utility functions.
6//
7// As of Go 1.16, the same functionality is now provided
8// by package io or package os, and those implementations
9// should be preferred in new code.
10// See the specific function documentation for details.
11package ioutil
12
13import (
14	"io"
15	"io/fs"
16	"os"
17	"sort"
18)
19
20// ReadAll reads from r until an error or EOF and returns the data it read.
21// A successful call returns err == nil, not err == EOF. Because ReadAll is
22// defined to read from src until EOF, it does not treat an EOF from Read
23// as an error to be reported.
24//
25// As of Go 1.16, this function simply calls io.ReadAll.
26func ReadAll(r io.Reader) ([]byte, error) {
27	return io.ReadAll(r)
28}
29
30// ReadFile reads the file named by filename and returns the contents.
31// A successful call returns err == nil, not err == EOF. Because ReadFile
32// reads the whole file, it does not treat an EOF from Read as an error
33// to be reported.
34//
35// As of Go 1.16, this function simply calls os.ReadFile.
36func ReadFile(filename string) ([]byte, error) {
37	return os.ReadFile(filename)
38}
39
40// WriteFile writes data to a file named by filename.
41// If the file does not exist, WriteFile creates it with permissions perm
42// (before umask); otherwise WriteFile truncates it before writing, without changing permissions.
43//
44// As of Go 1.16, this function simply calls os.WriteFile.
45func WriteFile(filename string, data []byte, perm fs.FileMode) error {
46	return os.WriteFile(filename, data, perm)
47}
48
49// ReadDir reads the directory named by dirname and returns
50// a list of fs.FileInfo for the directory's contents,
51// sorted by filename. If an error occurs reading the directory,
52// ReadDir returns no directory entries along with the error.
53//
54// As of Go 1.16, os.ReadDir is a more efficient and correct choice:
55// it returns a list of fs.DirEntry instead of fs.FileInfo,
56// and it returns partial results in the case of an error
57// midway through reading a directory.
58func ReadDir(dirname string) ([]fs.FileInfo, error) {
59	f, err := os.Open(dirname)
60	if err != nil {
61		return nil, err
62	}
63	list, err := f.Readdir(-1)
64	f.Close()
65	if err != nil {
66		return nil, err
67	}
68	sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
69	return list, nil
70}
71
72// NopCloser returns a ReadCloser with a no-op Close method wrapping
73// the provided Reader r.
74//
75// As of Go 1.16, this function simply calls io.NopCloser.
76func NopCloser(r io.Reader) io.ReadCloser {
77	return io.NopCloser(r)
78}
79
80// Discard is an io.Writer on which all Write calls succeed
81// without doing anything.
82//
83// As of Go 1.16, this value is simply io.Discard.
84var Discard io.Writer = io.Discard
85