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 }