vfs/dir.go

78 lines
1.2 KiB
Go

package vfs
import (
"fmt"
"io/fs"
"os"
"sync"
)
type directory struct {
name string
mode os.FileMode
children map[string]interface{}
mutex sync.Mutex
}
type directoryHandle struct {
dir *directory
idx int
}
func (d *directoryHandle) Stat() (fs.FileInfo, error) {
sz, err := d.dir.Size()
if err != nil {
return nil, err
}
return &fileInfo{
name: d.dir.name,
size: sz,
mode: d.dir.mode | fs.ModeDir,
}, nil
}
func (d *directoryHandle) Read(data []byte) (int, error) {
return 0, fmt.Errorf("%s is a directory", d.dir.name)
}
func (d *directoryHandle) Close() error {
return nil
}
func (d *directory) Size() (int64, error) {
sum := int64(0)
for _, e := range d.children {
switch v := e.(type) {
case *directory:
dir := v
sz, err := dir.Size()
if err != nil {
return 0, err
}
sum += sz
case *MockFile:
f := v
f.open = true
stat, err := f.Stat()
if err != nil {
return 0, err
}
sum += stat.Size()
f.open = false
case *File:
f := v
f.open = true
stat, err := f.Stat()
if err != nil {
return 0, err
}
sum += stat.Size()
f.open = false
}
}
return sum, nil
}