mirror of
https://github.com/onsonr/sonr.git
synced 2025-03-10 21:09:11 +00:00
121 lines
3.0 KiB
Go
121 lines
3.0 KiB
Go
package vfs
|
|
|
|
import (
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/ipfs/boxo/files"
|
|
)
|
|
|
|
// Folder represents a folder in the filesystem
|
|
type Folder string
|
|
|
|
// NewFolder creates a new Folder instance
|
|
func NewFolder(path string) Folder {
|
|
return Folder(path)
|
|
}
|
|
|
|
// Name returns the name of the folder
|
|
func (f Folder) Name() string {
|
|
return filepath.Base(string(f))
|
|
}
|
|
|
|
// Path returns the path of the folder
|
|
func (f Folder) Path() string {
|
|
return string(f)
|
|
}
|
|
|
|
// Create creates the folder if it doesn't exist
|
|
func (f Folder) Create() error {
|
|
return os.MkdirAll(string(f), os.ModePerm)
|
|
}
|
|
|
|
// Exists checks if the folder exists
|
|
func (f Folder) Exists() bool {
|
|
info, err := os.Stat(string(f))
|
|
return err == nil && info.IsDir()
|
|
}
|
|
|
|
// Ls lists the contents of the folder
|
|
func (f Folder) Ls() ([]fs.DirEntry, error) {
|
|
return os.ReadDir(string(f))
|
|
}
|
|
|
|
// WriteFile writes data to a file in the folder
|
|
func (f Folder) WriteFile(name string, data []byte, perm os.FileMode) (File, error) {
|
|
err := os.WriteFile(filepath.Join(string(f), name), data, perm)
|
|
return File(filepath.Join(string(f), name)), err
|
|
}
|
|
|
|
// ReadFile reads the contents of a file in the folder
|
|
func (f Folder) ReadFile(name string) ([]byte, error) {
|
|
return os.ReadFile(filepath.Join(string(f), name))
|
|
}
|
|
|
|
// DeleteFile deletes a file from the folder
|
|
func (f Folder) DeleteFile(name string) error {
|
|
return os.Remove(filepath.Join(string(f), name))
|
|
}
|
|
|
|
// Remove removes the folder and its contents
|
|
func (f Folder) Remove() error {
|
|
return os.RemoveAll(string(f))
|
|
}
|
|
|
|
// Join joins the folder path with the given elements
|
|
func (f Folder) Join(elem ...string) Folder {
|
|
return Folder(filepath.Join(append([]string{string(f)}, elem...)...))
|
|
}
|
|
|
|
// IsDir checks if the folder is a directory
|
|
func (f Folder) IsDir() bool {
|
|
info, err := os.Stat(string(f))
|
|
return err == nil && info.IsDir()
|
|
}
|
|
|
|
// Touch creates an empty file if it doesn't exist, or updates its access and modification times if it does
|
|
func (f Folder) Touch(name string) (File, error) {
|
|
var err error
|
|
filePath := filepath.Join(string(f), name)
|
|
_, err = os.Stat(filePath)
|
|
if os.IsNotExist(err) {
|
|
file, err := os.Create(filePath)
|
|
if err != nil {
|
|
return File(filePath), err
|
|
}
|
|
if err := file.Close(); err != nil {
|
|
return File(filePath), err
|
|
}
|
|
return File(filePath), nil
|
|
}
|
|
return File(filePath), err
|
|
}
|
|
|
|
// Node returns a files.Node representation of the folder
|
|
func (f Folder) Node() (files.Node, error) {
|
|
entries, err := f.Ls()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dirEntries := make([]files.DirEntry, 0, len(entries))
|
|
for _, entry := range entries {
|
|
if entry.IsDir() {
|
|
subFolder := f.Join(entry.Name())
|
|
subNode, err := subFolder.Node()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dirEntries = append(dirEntries, files.FileEntry(entry.Name(), subNode))
|
|
} else {
|
|
file := File(filepath.Join(string(f), entry.Name()))
|
|
fileNode, err := file.Node()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dirEntries = append(dirEntries, files.FileEntry(entry.Name(), fileNode))
|
|
}
|
|
}
|
|
return files.NewSliceDirectory(dirEntries), nil
|
|
}
|