Git Repository

miniaudiolib

miniaudiolib scannt lokale Musik- und Hörbuchordner, liest Audio-Metadaten und Cover, verwaltet Favoriten und Playlists und streamt Titel direkt an den Browser.

Projektseite ↗
HTTPShttps://zanvex.de/git/miniaudiolib.git

internal/logging/rotate.go

Zum Verzeichnis
package logging

import (
	"os"
	"path/filepath"
	"sync"
)

type RotatingWriter struct {
	mu   sync.Mutex
	path string
	max  int64
	file *os.File
}

func NewRotatingWriter(path string, max int64) (*RotatingWriter, error) {
	if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
		return nil, err
	}
	w := &RotatingWriter{path: path, max: max}
	return w, w.open()
}
func (w *RotatingWriter) open() error {
	f, e := os.OpenFile(w.path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	w.file = f
	return e
}
func (w *RotatingWriter) Write(p []byte) (int, error) {
	w.mu.Lock()
	defer w.mu.Unlock()
	if st, e := w.file.Stat(); e == nil && st.Size()+int64(len(p)) > w.max {
		w.file.Close()
		os.Remove(w.path + ".3")
		os.Rename(w.path+".2", w.path+".3")
		os.Rename(w.path+".1", w.path+".2")
		os.Rename(w.path, w.path+".1")
		if e = w.open(); e != nil {
			return 0, e
		}
	}
	return w.file.Write(p)
}
func (w *RotatingWriter) Close() error { w.mu.Lock(); defer w.mu.Unlock(); return w.file.Close() }