wr io.Writer
rr io.Reader
cu int64
- sync.RWMutex
+ l sync.RWMutex
}
type Config struct {
defer t.Close()
}
- if !t.TryRLock() {
+ if !t.l.TryRLock() {
return ErrFailToLock
}
- defer t.RUnlock()
+ defer t.l.RUnlock()
to.getRWCloser()
if t.Config.AutoClose {
}
if tryLock {
- if !to.TryLock() {
+ if !to.l.TryLock() {
return ErrFailToLock
}
} else {
- to.Lock()
+ to.l.Lock()
}
- defer to.Unlock()
+ defer to.l.Unlock()
return transferIO(t.read(), to.write(), byteInSec)
}
defer t.Close()
}
- if !t.TryRLock() {
+ if !t.l.TryRLock() {
return ErrFailToLock
}
- defer t.RUnlock()
+ defer t.l.RUnlock()
return transferIO(t.read(), to, byteInSec)
}
}
if tryLock {
- if !t.TryLock() {
+ if !t.l.TryLock() {
return 0, ErrFailToLock
}
} else {
- t.Lock()
+ t.l.Lock()
}
- defer t.Unlock()
+ defer t.l.Unlock()
return t.write().Write(data)
}
defer t.Close()
}
- if !t.TryRLock() {
+ if !t.l.TryRLock() {
return 0, ErrFailToLock
}
- defer t.RUnlock()
+ defer t.l.RUnlock()
return t.read().Read(data)
}
defer t.Close()
}
- if !t.TryRLock() {
+ if !t.l.TryRLock() {
return nil, ErrFailToLock
}
- defer t.RUnlock()
+ defer t.l.RUnlock()
var (
tmpArea = make([]byte, perReadSize)
defer t.Close()
}
- if !t.TryRLock() {
+ if !t.l.TryRLock() {
return nil, ErrFailToLock
}
- defer t.RUnlock()
+ defer t.l.RUnlock()
var (
tmpArea = make([]byte, perReadSize)
return
}
-func (t *File) Seed(index int64) (e error) {
+// Seek sets the offset for the next Read or Write on file to offset, interpreted according to whence: 0 means relative to the origin of the file, 1 means relative to the current offset, and 2 means relative to the end. It returns the new offset and an error, if any. The behavior of Seek on a file opened with O_APPEND is not specified.
+func (t *File) Seed(index int64, whence int) (e error) {
t.getRWCloser()
if t.Config.AutoClose {
defer t.Close()
}
- if !t.TryLock() {
+ if !t.l.TryLock() {
return ErrFailToLock
}
- defer t.Unlock()
+ defer t.l.Unlock()
- whenc := 0
- if index < 0 {
- whenc = 2
- }
- t.cu, e = t.file.Seek(index, whenc)
+ t.cu, e = t.file.Seek(index, whence)
return nil
}
defer t.Close()
}
- if !t.TryRLock() {
+ if !t.l.TryRLock() {
return ErrFailToLock
}
- defer t.RUnlock()
+ defer t.l.RUnlock()
return t.file.Sync()
}
+func (t *File) Create(tryLock bool) {
+ t.getRWCloser()
+ if t.Config.AutoClose {
+ defer t.Close()
+ }
+}
+
func (t *File) Delete() error {
- if !t.TryLock() {
+ if !t.l.TryLock() {
return ErrFailToLock
}
- defer t.Unlock()
+ defer t.l.Unlock()
if t.IsDir() {
return os.RemoveAll(t.Config.FilePath)
t.Fatal(e)
}
- if e := f.Seed(0); e != nil {
+ if e := f.Seed(0, 0); e != nil {
t.Fatal(e)
}
t.Fatal(e)
}
- if e := f.Seed(1); e != nil {
+ if e := f.Seed(1, 0); e != nil {
t.Fatal(e)
}
}
}
- if e := f.Seed(-1); e != nil {
+ if e := f.Seed(-1, 2); e != nil {
t.Fatal(e)
}
t.Fatal(e)
}
- if e := f.Seed(0); e != nil {
+ if e := f.Seed(0, 0); e != nil {
t.Fatal(e)
}
t.Fatal(e, string(data))
}
}
+
+func TestCreate(t *testing.T) {
+ sf := New("t.txt", 0, true)
+ defer sf.Delete()
+
+ if sf.IsExist() {
+ t.Fatal()
+ }
+ sf.Create(false)
+ if !sf.IsExist() {
+ t.Fatal()
+ }
+}