diff --git a/encfs/file.go b/encfs/file.go index a576f44..fe2981a 100644 --- a/encfs/file.go +++ b/encfs/file.go @@ -6,7 +6,6 @@ import ( "encoding/binary" "encoding/json" "errors" - "fmt" "io" "io/fs" "math" @@ -114,6 +113,20 @@ func NewEncFile(name string, file *os.File, encFs *EncFs, isCreate bool) (*EncFi } isDir := fileInfo.IsDir() var encFileMeta *EncFileMeta = nil + + fileState, err := os.Stat(name) + if err != nil { + if os.IsNotExist(err) { + isCreate = true + } else { + return nil, err + } + } else { + if !fileState.IsDir() && fileState.Size() == 0 { + isCreate = true + } + } + if !isDir { if isCreate { encFileMeta, err = openOrNewEncFileMeta(name) @@ -193,14 +206,9 @@ func (f *EncFile) Seek(offset int64, whence int) (int64, error) { return 0, checkIsFileErr } - // I do not understand whence - if whence != 0 { - return 0, fmt.Errorf("not supported whence: %d", whence) - } - ret, err := f.file.Seek(offset, whence) if err == nil { - f.filePos = offset + f.filePos = ret } return ret, err } diff --git a/encfs/fs.go b/encfs/fs.go index 6246275..3ca8ee3 100644 --- a/encfs/fs.go +++ b/encfs/fs.go @@ -56,28 +56,30 @@ func (encFs *EncFs) Open(name string) (afero.File, error) { return convertOsFileToEncFile(name, f, e, encFs, false) } -func (*EncFs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) { +func (encFs *EncFs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) { f, e := os.OpenFile(name, flag, perm) if f == nil { // while this looks strange, we need to return a bare nil (of type nil) not // a nil value of type *os.File or nil won't be nil return nil, e } - return f, e + return convertOsFileToEncFile(name, f, e, encFs, false) } func (*EncFs) Remove(name string) error { - // TODO remove enc file meta + encFileMetaName := name + EncFileExt + _ = os.Remove(encFileMetaName) return os.Remove(name) } func (*EncFs) RemoveAll(path string) error { - // TODO remove enc file meta return os.RemoveAll(path) } func (*EncFs) Rename(oldname, newname string) error { - // TODO rename enc file meta + oldEncFileMetaName := oldname + EncFileExt + newEncFileMetaName := newname + EncFileExt + _ = os.Rename(oldEncFileMetaName, newEncFileMetaName) return os.Rename(oldname, newname) } diff --git a/main.go b/main.go index 8eb9715..0d673f0 100644 --- a/main.go +++ b/main.go @@ -10,38 +10,9 @@ import ( func main() { key := []byte{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } - fmt.Println(hex.EncodeToString(key)) - encFs := encfs.NewEncFs(key) - encFs2 := encfs.NewEncFs(nil) - - // ----------------------------------------------------------------------------------------------------------------------------------- - encFile1, err := encFs2.Create("test1") - if err != nil { - fmt.Println(err) - return - } - encFile1.Write([]byte("hello world")) - encFile1.Write([]byte("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX")) - encFile1.WriteAt([]byte("TEST"), 10) - encFile1.Write([]byte("------")) - encFile1.Close() - - encFile2, err := encFs2.Create("test2") - if err != nil { - fmt.Println(err) - return - } - encFile2.Write([]byte("hello world")) - seekI, err := encFile2.Seek(2, 0) - fmt.Println(seekI, ", ", err) - encFile2.Write([]byte("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX")) - encFile2.Write([]byte("------")) - encFile2.Close() - - // ----------------------------------------------------------------------------------------------------------------------------------- func() { encFile, err := encFs.Create("test") @@ -80,4 +51,6 @@ func main() { fmt.Println(readLen, err) fmt.Println(string(buff)) }() + + encFs.Remove("test") }