【问题标题】:Cannot programmatically delete SVN working copy无法以编程方式删除 SVN 工作副本
【发布时间】:2019-11-16 13:02:26
【问题描述】:

我在应用程序中使用SharpSvn 库。作为自动化集成测试的一部分,我创建了一个测试存储库,签出一个工作副本,执行一些测试,然后删除存储库和工作副本文件夹。

然而,一个简单的Directory.Delete(workingCopyPath, true); 总是会产生一个UnauthorizedAccessException 并带有消息“对路径'条目'的访问被拒绝。”。我可以用这段代码重现错误:

     using (var svnClient = new SvnClient())
     {
        svnClient.CheckOut(
           new SvnUriTarget(new Uri(repositoryPath)), workingCopyPath);
     }
     Directory.Delete(workingCopyPath, true);

如果我仍然会出现此错误

  • 尝试删除创建的工作副本 通过上一次运行的集成 测试
  • Thread.Sleep 几秒前 试图删除

如果我使用资源管理器手动删除临时工作副本,我不会收到任何错误。

这里出了什么问题?以编程方式删除颠覆工作副本的正确方法是什么?

【问题讨论】:

  • 可能您的某个集成自动化测试流程的当前目录设置为工作副本中的目录,或者仍在使用副本中的文件。
  • 不,这就是为什么我提到我也不能删除由 previous 运行创建的工作副本。上一次运行的进程不再运行,所以我会说它不能保持任何资源锁定。

标签: svn sharpsvn


【解决方案1】:

原来Directory.Delete 拒绝删除只读文件。

我现在用这个方法来删除目录:

private void DeleteDirectory(string path)
{
   var directory = new DirectoryInfo(path);
   DisableReadOnly(directory);
   directory.Delete(true);
}

private void DisableReadOnly(DirectoryInfo directory)
{
   foreach (var file in directory.GetFiles())
   {
      if (file.IsReadOnly)
         file.IsReadOnly = false;
   }
   foreach (var subdirectory in directory.GetDirectories())
   {
      DisableReadOnly(subdirectory);
   }
}

【讨论】:

  • 这种方式应该很好用。顺便说一句,您应该能够接受自己的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多