github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/backend/local/remove_windows.go (about)

     1  //+build windows
     2  
     3  package local
     4  
     5  import (
     6  	"os"
     7  	"syscall"
     8  	"time"
     9  
    10  	"github.com/rclone/rclone/fs"
    11  )
    12  
    13  const (
    14  	ERROR_SHARING_VIOLATION syscall.Errno = 32
    15  )
    16  
    17  // Removes name, retrying on a sharing violation
    18  func remove(name string) (err error) {
    19  	const maxTries = 10
    20  	var sleepTime = 1 * time.Millisecond
    21  	for i := 0; i < maxTries; i++ {
    22  		err = os.Remove(name)
    23  		if err == nil {
    24  			break
    25  		}
    26  		pathErr, ok := err.(*os.PathError)
    27  		if !ok {
    28  			break
    29  		}
    30  		if pathErr.Err != ERROR_SHARING_VIOLATION {
    31  			break
    32  		}
    33  		fs.Logf(name, "Remove detected sharing violation - retry %d/%d sleeping %v", i+1, maxTries, sleepTime)
    34  		time.Sleep(sleepTime)
    35  		sleepTime <<= 1
    36  	}
    37  	return err
    38  }