func (r *rollingFile) Write(b []byte) (int, error) { r.mu.Lock() defer r.mu.Unlock() if r.closed { return 0, errors.Trace(ErrClosedRollingFile) } if err := r.roll(); err != nil { return 0, err } n, err := r.file.Write(b) r.fragSize += int64(n) if err != nil { return n, errors.Trace(err) } else { return n, nil } }
func (r *rollingFile) Close() error { r.mu.Lock() defer r.mu.Unlock() if r.closed { return nil } r.closed = true if f := r.file; f != nil { r.file = nil return errors.Trace(f.Close()) } return nil }
func (r *rollingFile) roll() error { if r.file != nil { if r.fragSize < r.maxFragSize { return nil } r.file.Close() r.file = nil } r.fragSize = 0 r.fileFrag = (r.fileFrag + 1) % r.maxFileFrag r.filePath = fmt.Sprintf("%s.%d", r.basePath, r.fileFrag) f, err := os.OpenFile(r.filePath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) if err != nil { return errors.Trace(err) } else { r.file = f return nil } }
func OpenFile(path string) (*os.File, error) { f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0666) return f, errors.Trace(err) }