add directory size calculations
This commit is contained in:
parent
0892929695
commit
3993ce191a
43
dir.go
43
dir.go
@ -20,9 +20,14 @@ type directoryHandle struct {
|
||||
}
|
||||
|
||||
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: 4096,
|
||||
size: sz,
|
||||
mode: d.dir.mode | fs.ModeDir,
|
||||
}, nil
|
||||
}
|
||||
@ -34,3 +39,39 @@ func (d *directoryHandle) Read(data []byte) (int, error) {
|
||||
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
|
||||
}
|
||||
|
52
vfs_test.go
52
vfs_test.go
@ -44,13 +44,13 @@ func TestVFS_Basic(t *testing.T) {
|
||||
|
||||
func TestVFS_MockFile(t *testing.T) {
|
||||
vfs := NewVFS()
|
||||
path := "test.txt"
|
||||
p := "test.txt"
|
||||
sz := int64(8096)
|
||||
|
||||
err := vfs.CreateMockFile(path, sz, 0666)
|
||||
err := vfs.CreateMockFile(p, sz, 0666)
|
||||
assert.NoError(t, err)
|
||||
|
||||
fp, err := vfs.Open(path)
|
||||
fp, err := vfs.Open(p)
|
||||
assert.NoError(t, err)
|
||||
|
||||
stat, err := fp.Stat()
|
||||
@ -60,3 +60,49 @@ func TestVFS_MockFile(t *testing.T) {
|
||||
err = fp.Close()
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestVFS_DirSize(t *testing.T) {
|
||||
vfs := NewVFS()
|
||||
|
||||
err := vfs.MkdirAll("root/one", 0777)
|
||||
assert.NoError(t, err)
|
||||
|
||||
err = vfs.MkdirAll("root/two", 0777)
|
||||
assert.NoError(t, err)
|
||||
|
||||
files := []string{
|
||||
"root/one/f1",
|
||||
"root/one/f2",
|
||||
"root/two/f1",
|
||||
"root/two/f2",
|
||||
"root/two/f3",
|
||||
"root/two/f4",
|
||||
}
|
||||
|
||||
sz := int64(1)
|
||||
for _, file := range files {
|
||||
err = vfs.CreateMockFile(file, sz, 0666)
|
||||
assert.NoError(t, err)
|
||||
|
||||
}
|
||||
|
||||
fp, err := vfs.Open("root/one")
|
||||
assert.NoError(t, err)
|
||||
|
||||
stat, err := fp.Stat()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, stat.Size(), int64(2))
|
||||
|
||||
err = fp.Close()
|
||||
assert.NoError(t, err)
|
||||
|
||||
fp, err = vfs.Open("root/two")
|
||||
assert.NoError(t, err)
|
||||
|
||||
stat, err = fp.Stat()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, stat.Size(), int64(4))
|
||||
|
||||
err = fp.Close()
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user