54 lines
1.9 KiB
Go
54 lines
1.9 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package robustio wraps I/O functions that are prone to failure on Windows,
|
|
// transparently retrying errors up to an arbitrary timeout.
|
|
//
|
|
// Errors are classified heuristically and retries are bounded, so the functions
|
|
// in this package do not completely eliminate spurious errors. However, they do
|
|
// significantly reduce the rate of failure in practice.
|
|
//
|
|
// If so, the error will likely wrap one of:
|
|
// The functions in this package do not completely eliminate spurious errors,
|
|
// but substantially reduce their rate of occurrence in practice.
|
|
package robustio
|
|
|
|
// Rename is like os.Rename, but on Windows retries errors that may occur if the
|
|
// file is concurrently read or overwritten.
|
|
//
|
|
// (See golang.org/issue/31247 and golang.org/issue/32188.)
|
|
func Rename(oldpath, newpath string) error {
|
|
return rename(oldpath, newpath)
|
|
}
|
|
|
|
// ReadFile is like ioutil.ReadFile, but on Windows retries errors that may
|
|
// occur if the file is concurrently replaced.
|
|
//
|
|
// (See golang.org/issue/31247 and golang.org/issue/32188.)
|
|
func ReadFile(filename string) ([]byte, error) {
|
|
return readFile(filename)
|
|
}
|
|
|
|
// RemoveAll is like os.RemoveAll, but on Windows retries errors that may occur
|
|
// if an executable file in the directory has recently been executed.
|
|
//
|
|
// (See golang.org/issue/19491.)
|
|
func RemoveAll(path string) error {
|
|
return removeAll(path)
|
|
}
|
|
|
|
// IsEphemeralError reports whether err is one of the errors that the functions
|
|
// in this package attempt to mitigate.
|
|
//
|
|
// Errors considered ephemeral include:
|
|
// - syscall.ERROR_ACCESS_DENIED
|
|
// - syscall.ERROR_FILE_NOT_FOUND
|
|
// - internal/syscall/windows.ERROR_SHARING_VIOLATION
|
|
//
|
|
// This set may be expanded in the future; programs must not rely on the
|
|
// non-ephemerality of any given error.
|
|
func IsEphemeralError(err error) bool {
|
|
return isEphemeralError(err)
|
|
}
|