Path: blob/dev/pkg/output/file_output_writer.go
2070 views
package output12import (3"os"4"sync"5)67// fileWriter is a concurrent file based output writer.8type fileWriter struct {9file *os.File10mu sync.Mutex11}1213// NewFileOutputWriter creates a new buffered writer for a file14func newFileOutputWriter(file string, resume bool) (*fileWriter, error) {15var output *os.File16var err error17if resume {18output, err = os.OpenFile(file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)19} else {20output, err = os.Create(file)21}22if err != nil {23return nil, err24}25return &fileWriter{file: output}, nil26}2728// WriteString writes an output to the underlying file29func (w *fileWriter) Write(data []byte) (int, error) {30w.mu.Lock()31defer w.mu.Unlock()32if _, err := w.file.Write(data); err != nil {33return 0, err34}35if _, err := w.file.Write([]byte("\n")); err != nil {36return 0, err37}38return len(data) + 1, nil39}4041// Close closes the underlying writer flushing everything to disk42func (w *fileWriter) Close() error {43w.mu.Lock()44defer w.mu.Unlock()45//nolint:errcheck // we don't care whether sync failed or succeeded.46w.file.Sync()47return w.file.Close()48}495051