| // Copyright 2020 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package fs | |
| import ( | |
| "errors" | |
| "sort" | |
| ) | |
| // ReadDirFS is the interface implemented by a file system | |
| // that provides an optimized implementation of ReadDir. | |
| type ReadDirFS interface { | |
| FS | |
| // ReadDir reads the named directory | |
| // and returns a list of directory entries sorted by filename. | |
| ReadDir(name string) ([]DirEntry, error) | |
| } | |
| // ReadDir reads the named directory | |
| // and returns a list of directory entries sorted by filename. | |
| // | |
| // If fs implements ReadDirFS, ReadDir calls fs.ReadDir. | |
| // Otherwise ReadDir calls fs.Open and uses ReadDir and Close | |
| // on the returned file. | |
| func ReadDir(fsys FS, name string) ([]DirEntry, error) { | |
| if fsys, ok := fsys.(ReadDirFS); ok { | |
| return fsys.ReadDir(name) | |
| } | |
| file, err := fsys.Open(name) | |
| if err != nil { | |
| return nil, err | |
| } | |
| defer file.Close() | |
| dir, ok := file.(ReadDirFile) | |
| if !ok { | |
| return nil, &PathError{Op: "readdir", Path: name, Err: errors.New("not implemented")} | |
| } | |
| list, err := dir.ReadDir(-1) | |
| sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() }) | |
| return list, err | |
| } |