sonr/pkg/vfs/file.go

97 lines
2.0 KiB
Go

package vfs
import (
"fmt"
"io/fs"
"os"
"path/filepath"
"github.com/ipfs/boxo/files"
)
// File represents a file in the filesystem
type File string
// NewFile creates a new File instance
func NewFile(path string) File {
return File(path)
}
// Name returns the name of the file
func (f File) Name() string {
return filepath.Base(string(f))
}
// Path returns the path of the file
func (f File) Path() string {
return string(f)
}
// Read reads the contents of the file
func (f File) Read() ([]byte, error) {
return os.ReadFile(string(f))
}
// Write writes data to the file, but throws an error if the file already exists
func (f File) Write(data []byte) error {
if f.Exists() {
return fmt.Errorf("file already exists: %s", f)
}
return os.WriteFile(string(f), data, 0644)
}
// Append appends data to the file
func (f File) Append(data []byte) error {
file, err := os.OpenFile(string(f), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return err
}
defer file.Close()
_, err = file.Write(data)
return err
}
// Overwrite deletes all data for the file at path if it exists and writes the new data
func (f File) Overwrite(data []byte) error {
// If the file exists, remove it first
if f.Exists() {
if err := f.Remove(); err != nil {
return fmt.Errorf("failed to remove existing file: %w", err)
}
}
// Write the new data
return os.WriteFile(string(f), data, 0644)
}
// Exists checks if the file exists
func (f File) Exists() bool {
_, err := os.Stat(string(f))
return !os.IsNotExist(err)
}
// Remove removes the file
func (f File) Remove() error {
return os.Remove(string(f))
}
// Stat returns the FileInfo for the file
func (f File) Stat() (os.FileInfo, error) {
return os.Stat(string(f))
}
// Open opens the file and returns an fs.File
func (f File) Open() (fs.File, error) {
return os.Open(string(f))
}
// Node returns a files.Node representation of the file
func (f File) Node() (files.Node, error) {
file, err := os.Open(string(f))
if err != nil {
return nil, err
}
return files.NewReaderFile(file), nil
}