|
- package mount
-
- import (
- "io"
- "os"
- "time"
- )
-
- // 目录从设计上来说不需要打开操作,所以dirHandle就是fusefs的DirHandle接口的完整实现。
- type dirHandle struct {
- dir FsDir
- dirReader DirReader
- }
-
- func newDirHandle(dir FsDir, dirReader DirReader) *dirHandle {
- return &dirHandle{dir: dir, dirReader: dirReader}
- }
-
- // Readdir reads the contents of the directory associated with file and returns
- // a slice of up to n FileInfo values, as would be returned by Lstat, in
- // directory order. Subsequent calls on the same file will yield further
- // FileInfos.
- //
- // If n > 0, Readdir returns at most n FileInfo structures. In this case, if
- // Readdir returns an empty slice, it will return a non-nil error explaining
- // why. At the end of a directory, the error is io.EOF.
- //
- // If n <= 0, Readdir returns all the FileInfo from the directory in a single
- // slice. In this case, if Readdir succeeds (reads all the way to the end of
- // the directory), it returns the slice and a nil error. If it encounters an
- // error before the end of the directory, Readdir returns the FileInfo read
- // until that point and a non-nil error.
- func (fh *dirHandle) Readdir(n int) (fis []os.FileInfo, err error) {
- entries, err := fh.dirReader.Next(n)
- if err != nil {
- return nil, err
- }
-
- if len(entries) == 0 {
- return nil, io.EOF
- }
-
- var infos []os.FileInfo
- for _, entry := range entries {
- infos = append(infos, &fileInfo{entry})
- }
-
- return infos, nil
- }
-
- // Readdirnames reads and returns a slice of names from the directory f.
- //
- // If n > 0, Readdirnames returns at most n names. In this case, if
- // Readdirnames returns an empty slice, it will return a non-nil error
- // explaining why. At the end of a directory, the error is io.EOF.
- //
- // If n <= 0, Readdirnames returns all the names from the directory in a single
- // slice. In this case, if Readdirnames succeeds (reads all the way to the end
- // of the directory), it returns the slice and a nil error. If it encounters an
- // error before the end of the directory, Readdirnames returns the names read
- // until that point and a non-nil error.
- func (fh *dirHandle) Readdirnames(n int) (names []string, err error) {
- entries, err := fh.dirReader.Next(n)
- if err != nil {
- return nil, err
- }
-
- if len(entries) == 0 {
- return nil, io.EOF
- }
-
- for _, entry := range entries {
- names = append(names, entry.Name())
- }
-
- return names, nil
- }
-
- // Close closes the handle
- func (fh *dirHandle) Close() (err error) {
- fh.dirReader.Close()
- return nil
- }
-
- type fileInfo struct {
- entry FsEntry
- }
-
- func (fi *fileInfo) Name() string {
- return fi.entry.Name()
- }
-
- func (fi *fileInfo) Size() int64 {
- return fi.entry.Size()
- }
-
- func (fi *fileInfo) Mode() os.FileMode {
- return os.FileMode(fi.entry.Mode())
- }
-
- // ModTime returns the modification time of the file
- func (fi *fileInfo) ModTime() time.Time {
- return fi.entry.ModTime()
- }
-
- func (fi *fileInfo) IsDir() bool {
- return fi.entry.IsDir()
- }
-
- func (fi *fileInfo) Sys() interface{} {
- return nil
- }
|