func Remove(name string) error { p, e := syscall.UTF16PtrFromString(name) if e != nil { return &os.PathError{"remove", name, e} } // Go file interface forces us to know whether // name is a file or directory. Try both. e = syscall.DeleteFile(p) if e == nil { return nil } e1 := syscall.RemoveDirectory(p) if e1 == nil { return nil } fi, err := os.Lstat(name) if err != nil { return err } if !fi.IsDir() { if fi.Mode().Perm() != 0777 { _ = os.Chmod(name, 0777) if err = syscall.DeleteFile(p); err == nil { return err } } } // TODO(maruel): Add DACL handling. return &os.PathError{"remove", name, e} }
// Remove removes the named file or directory. // If there is an error, it will be of type *PathError. func Remove(name string) error { p, e := syscall.UTF16PtrFromString(name) if e != nil { return &PathError{"remove", name, e} } // Go file interface forces us to know whether // name is a file or directory. Try both. e = syscall.DeleteFile(p) if e == nil { return nil } e1 := syscall.RemoveDirectory(p) if e1 == nil { return nil } // Both failed: figure out which error to return. if e1 != e { a, e2 := syscall.GetFileAttributes(p) if e2 != nil { e = e2 } else { if a&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { e = e1 } } } return &PathError{"remove", name, e} }