1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
//go:build windows
// +build windows
package tools
import (
"errors"
"os"
"github.com/avast/retry-go"
"golang.org/x/sys/windows"
)
// isEphemeralError returns true if err may be resolved by waiting.
func isEphemeralError(err error) bool {
return errors.Is(err, windows.ERROR_SHARING_VIOLATION)
}
func RobustRename(oldpath, newpath string) error {
return retry.Do(
func() error {
return os.Rename(oldpath, newpath)
},
retry.RetryIf(isEphemeralError),
retry.LastErrorOnly(true),
)
}
func RobustOpen(name string) (*os.File, error) {
var result *os.File
return result, retry.Do(
func() error {
f, err := os.Open(name)
result = f
return err
},
retry.RetryIf(isEphemeralError),
retry.LastErrorOnly(true),
)
}
|