| // 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 |
| } |