Chris Lu
7 years ago
4 changed files with 117 additions and 100 deletions
@ -0,0 +1,62 @@ |
|||||
|
package filesys |
||||
|
|
||||
|
import ( |
||||
|
"bazil.org/fuse/fs" |
||||
|
"bazil.org/fuse" |
||||
|
"context" |
||||
|
"os" |
||||
|
"fmt" |
||||
|
"path" |
||||
|
"github.com/chrislusf/seaweedfs/weed/filer" |
||||
|
) |
||||
|
|
||||
|
type Dir struct { |
||||
|
Path string |
||||
|
wfs *WFS |
||||
|
} |
||||
|
|
||||
|
func (dir *Dir) Attr(context context.Context, attr *fuse.Attr) error { |
||||
|
attr.Mode = os.ModeDir | 0555 |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func (dir *Dir) Lookup(ctx context.Context, name string) (fs.Node, error) { |
||||
|
if entry, err := filer.LookupDirectoryEntry(dir.wfs.filer, dir.Path, name); err == nil { |
||||
|
if !entry.Found { |
||||
|
return nil, fuse.ENOENT |
||||
|
} |
||||
|
if entry.FileId != "" { |
||||
|
return &File{FileId: filer.FileId(entry.FileId), Name: name, wfs: dir.wfs}, nil |
||||
|
} else { |
||||
|
return &Dir{Path: path.Join(dir.Path, name), wfs: dir.wfs}, nil |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return nil, fuse.ENOENT |
||||
|
} |
||||
|
|
||||
|
func (dir *Dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { |
||||
|
var ret []fuse.Dirent |
||||
|
if dirs, e := filer.ListDirectories(dir.wfs.filer, dir.Path); e == nil { |
||||
|
for _, d := range dirs.Directories { |
||||
|
dirent := fuse.Dirent{Name: string(d), Type: fuse.DT_Dir} |
||||
|
ret = append(ret, dirent) |
||||
|
} |
||||
|
} |
||||
|
if files, e := filer.ListFiles(dir.wfs.filer, dir.Path, ""); e == nil { |
||||
|
for _, f := range files.Files { |
||||
|
dirent := fuse.Dirent{Name: f.Name, Type: fuse.DT_File} |
||||
|
ret = append(ret, dirent) |
||||
|
} |
||||
|
} |
||||
|
return ret, nil |
||||
|
} |
||||
|
|
||||
|
func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { |
||||
|
name := path.Join(dir.Path, req.Name) |
||||
|
err := filer.DeleteDirectoryOrFile(dir.wfs.filer, name, req.Dir) |
||||
|
if err != nil { |
||||
|
fmt.Printf("Delete file %s [ERROR] %s\n", name, err) |
||||
|
} |
||||
|
return err |
||||
|
} |
@ -0,0 +1,34 @@ |
|||||
|
package filesys |
||||
|
|
||||
|
import ( |
||||
|
"bazil.org/fuse" |
||||
|
"fmt" |
||||
|
"github.com/chrislusf/seaweedfs/weed/filer" |
||||
|
"context" |
||||
|
) |
||||
|
|
||||
|
type File struct { |
||||
|
FileId filer.FileId |
||||
|
Name string |
||||
|
wfs *WFS |
||||
|
} |
||||
|
|
||||
|
func (file *File) Attr(context context.Context, attr *fuse.Attr) error { |
||||
|
attr.Mode = 0444 |
||||
|
ret, err := filer.GetFileSize(file.wfs.filer, string(file.FileId)) |
||||
|
if err == nil { |
||||
|
attr.Size = ret.Size |
||||
|
} else { |
||||
|
fmt.Printf("Get file %s attr [ERROR] %s\n", file.Name, err) |
||||
|
} |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
func (file *File) ReadAll(ctx context.Context) ([]byte, error) { |
||||
|
ret, err := filer.GetFileContent(file.wfs.filer, string(file.FileId)) |
||||
|
if err == nil { |
||||
|
return ret.Content, nil |
||||
|
} |
||||
|
fmt.Printf("Get file %s content [ERROR] %s\n", file.Name, err) |
||||
|
return nil, err |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
package filesys |
||||
|
|
||||
|
import "bazil.org/fuse/fs" |
||||
|
|
||||
|
type WFS struct { |
||||
|
filer string |
||||
|
} |
||||
|
|
||||
|
func NewSeaweedFileSystem(filer string) *WFS { |
||||
|
return &WFS{ |
||||
|
filer: filer, |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func (wfs *WFS) Root() (fs.Node, error) { |
||||
|
return &Dir{Path: "/", wfs: wfs}, nil |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue