42 lines
932 B
Go
42 lines
932 B
Go
package files
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
PartFileName = ".download.part"
|
|
JobFileName = ".job.json"
|
|
temporaryPrefix = ".ddc-tmp-"
|
|
temporaryWildcard = temporaryPrefix + "*"
|
|
)
|
|
|
|
func IsInternal(name string) bool {
|
|
return name == PartFileName || name == JobFileName || strings.HasPrefix(name, temporaryPrefix)
|
|
}
|
|
|
|
func WriteAtomically(path string, data []byte) error {
|
|
temporary, err := os.CreateTemp(filepath.Dir(path), temporaryWildcard)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, writeErr := temporary.Write(data)
|
|
closeErr := temporary.Close()
|
|
if writeErr != nil || closeErr != nil {
|
|
os.Remove(temporary.Name())
|
|
return errors.Join(writeErr, closeErr)
|
|
}
|
|
if err := os.Chmod(temporary.Name(), 0o644); err != nil {
|
|
os.Remove(temporary.Name())
|
|
return err
|
|
}
|
|
if err := os.Rename(temporary.Name(), path); err != nil {
|
|
os.Remove(temporary.Name())
|
|
return err
|
|
}
|
|
return nil
|
|
}
|