浏览代码

[dav] keep opened annex file pointer for read

cgars 7 年之前
父节点
当前提交
0e835bbf21
共有 1 个文件被更改,包括 16 次插入6 次删除
  1. 16 6
      pkg/dav/dav.go

+ 16 - 6
pkg/dav/dav.go

@@ -88,6 +88,7 @@ type GinFile struct {
 	seekoset  int64
 	LChange   time.Time
 	rpath     string
+	afp       *os.File
 }
 
 func (f *GinFile) Write(p []byte) (n int, err error) {
@@ -95,6 +96,9 @@ func (f *GinFile) Write(p []byte) (n int, err error) {
 }
 
 func (f *GinFile) Close() error {
+	if f.afp != nil {
+		return f.afp.Close()
+	}
 	return nil
 }
 
@@ -114,6 +118,9 @@ func (f *GinFile) read(p []byte) (int, error) {
 	return n, nil
 }
 func (f *GinFile) Read(p []byte) (int, error) {
+	if f.afp != nil {
+		return f.afp.Read(p)
+	}
 	tmp := make([]byte, len(p))
 	n, err := f.read(tmp)
 	tmp = tmp[:n]
@@ -127,17 +134,20 @@ func (f *GinFile) Read(p []byte) (int, error) {
 		if err != nil {
 			return n, err
 		}
-		afp, _ := af.Open()
-		defer afp.Close()
-		afp.Seek(f.seekoset, io.SeekStart)
-		defer afp.Close()
-		return afp.Read(p)
+		f.afp, _ = af.Open()
+		f.afp.Seek(f.seekoset, io.SeekStart)
+		return f.afp.Read(p)
 	}
 	copy(p, tmp[f.seekoset:])
-	return n - int(f.seekoset), nil
+	n = n - int(f.seekoset)
+	f.Seek(int64(n), io.SeekCurrent)
+	return n, nil
 }
 
 func (f *GinFile) Seek(offset int64, whence int) (int64, error) {
+	if f.afp != nil {
+		return f.afp.Seek(offset, whence)
+	}
 	st, err := f.Stat()
 	if err != nil {
 		return f.seekoset, err