anchor.diff:      member this.OpenWith exePath itemPath =
           Process.Start(exePath, sprintf "\"%s\"" (wpath itemPath)) |> ignore
   
  +
  +    member private this.PrepForOverwrite file =
  +        if file.Exists then
  +            if file.Attributes.HasFlag FileAttributes.System then
  +                raise <| UnauthorizedAccessException(sprintf "%s is a System file." file.Name)
  +            let flagsToClear = FileAttributes.ReadOnly ||| FileAttributes.Hidden
  +            if unbox<int> (file.Attributes &&& flagsToClear) <> 0 then
  +                file.Attributes <- file.Attributes &&& (~~~flagsToClear)
   
       member private this.FileNode file = {
           Path = toPath file.FullName
  
positive.code: 
      member this.Delete path =
          let wp = wpath path
          // need to clear attributes since the Delete API refuses to delete read-only files
          let resetAttr p = File.SetAttributes(p, FileAttributes.Normal);
          if Directory.Exists wp then
              Directory.GetFiles(wp, "*", SearchOption.AllDirectories)
                  |> Seq.iter (fun file -> resetAttr file)
              Directory.Delete(wp, true)
          else
              resetAttr wp
              File.Delete wp
  
      member this.OpenFile path =
  
negative.code:     member this.Copy currentPath newPath =
          let source = wpath currentPath
          let dest = wpath newPath
          let copyFile source dest =
              this.PrepForOverwrite <| FileInfo dest
              File.Copy(source, dest, true)
          if Directory.Exists source then
              let getDest sourcePath = Regex.Replace(sourcePath, "^" + (Regex.Escape source), dest)
              // copy folder structure
  