2023-07-27 22:33:43 +00:00
|
|
|
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) {
|
2023-08-05 19:01:26 +00:00
|
|
|
sz, err := d.dir.Size()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2023-07-27 22:33:43 +00:00
|
|
|
return &fileInfo{
|
|
|
|
name: d.dir.name,
|
2023-08-05 19:01:26 +00:00
|
|
|
size: sz,
|
2023-07-27 22:33:43 +00:00
|
|
|
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
|
|
|
|
}
|
2023-08-05 19:01:26 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|