Files
go-afero-encfs/encfs/file.go
2024-09-01 14:20:27 +08:00

140 lines
2.4 KiB
Go

package encfs
import (
"os"
"syscall"
"github.com/spf13/afero"
)
type EncFile struct {
isDir bool
closed bool
file *os.File
}
func NewEncFile(file *os.File) (*EncFile, error) {
fileInfo, err := file.Stat()
if err != nil {
return nil, err
}
isDir := fileInfo.IsDir()
return &EncFile{
isDir: isDir,
closed: false,
file: file,
}, nil
}
func (f *EncFile) Close() error {
if f.closed {
return afero.ErrFileClosed
}
f.closed = true
return f.file.Close()
}
func (f *EncFile) Read(p []byte) (n int, err error) {
checkIsFileErr := f.checkIsFile()
if checkIsFileErr != nil {
return 0, checkIsFileErr
}
// TODO decrypt
return f.file.Read(p)
}
func (f *EncFile) ReadAt(p []byte, off int64) (n int, err error) {
checkIsFileErr := f.checkIsFile()
if checkIsFileErr != nil {
return 0, checkIsFileErr
}
// TODO decrypt
return f.file.ReadAt(p, off)
}
func (f *EncFile) Seek(offset int64, whence int) (int64, error) {
checkIsFileErr := f.checkIsFile()
if checkIsFileErr != nil {
return 0, checkIsFileErr
}
// TODO decrypt
return f.file.Seek(offset, whence)
}
func (f *EncFile) Write(p []byte) (n int, err error) {
checkIsFileErr := f.checkIsFile()
if checkIsFileErr != nil {
return 0, checkIsFileErr
}
// TODO encrypt
return f.file.Write(p)
}
func (f *EncFile) WriteAt(p []byte, off int64) (n int, err error) {
checkIsFileErr := f.checkIsFile()
if checkIsFileErr != nil {
return 0, checkIsFileErr
}
// TODO encrypt
return f.file.WriteAt(p, off)
}
func (f *EncFile) Name() string {
return f.file.Name()
}
func (f *EncFile) Readdir(count int) ([]os.FileInfo, error) {
if f.closed {
return nil, afero.ErrFileClosed
}
return f.file.Readdir(count)
}
func (f *EncFile) Readdirnames(n int) ([]string, error) {
fi, err := f.Readdir(n)
if err != nil {
return nil, err
}
var names []string
for _, f := range fi {
names = append(names, f.Name())
}
return names, nil
}
func (f *EncFile) Stat() (os.FileInfo, error) {
return f.file.Stat()
}
func (f *EncFile) Sync() error {
return f.file.Sync()
}
func (f *EncFile) Truncate(size int64) error {
return f.file.Truncate(size)
}
func (f *EncFile) WriteString(s string) (ret int, err error) {
// TODO encrypt
return f.file.WriteString(s)
}
func (f *EncFile) checkIsFile() error {
if f.closed {
return afero.ErrFileClosed
}
if f.isDir {
return syscall.EISDIR
}
return nil
}