【问题标题】:Programmatically delete local repository with LibGit2Sharp使用 LibGit2Sharp 以编程方式删除本地存储库
【发布时间】:2014-10-22 08:41:52
【问题描述】:

我想删除使用 LibGit2Sharp 从远程存储库克隆的本地存储库文件夹。 我在这里读到here,我必须先 Dispose() 存储库才能删除它,但它仍然不能正常工作。

using (var repo = new LibGit2Sharp.Repository(path))
{
    repo.Dispose();
}

Directory.DeleteFolder(path);

我还有一个例外:

Access to the path 'c16566a7-202a-4c8a-84de-3e3caadd5af9' is denied.

'path'变量的内容如下:

 C:\Users\USERNAME\AppData\Local\dftmp\Resources\c16566a7-202a-4c8a-84de-3e3caadd5af9\directory\UserRepos\github.com\domonkosgabor\testrepo

此文件夹由工作人员角色创建到本地存储。

我应该怎么做才能删除整个文件夹(包括.git)?

【问题讨论】:

  • 您的 path 文件夹有一个 Guid,而不是文件夹路径。它来自哪里?还有,I read here that I have to Dispose()这里在哪里?忘记链接了吗?
  • 我在问题中添加了更多信息。
  • 两件事:1) 您是否以足够的权限执行此代码(即作为管理员?) 2) 在 DeleteFolder 代码之前添加代码 if (Directory.Exists(path)) 以确保目录确实存在.

标签: c# git github azure-worker-roles libgit2sharp


【解决方案1】:

我想删除使用 LibGit2Sharp 从远程存储库克隆的本地存储库文件夹。我在这里读到,我必须先 Dispose() 存储库,然后才能删除它。

LibGit2Sharp 保留 .git 文件夹中的一些文件(主要是出于性能原因的包文件)。调用Dispose() 将释放这些句柄并释放非托管内存。

因此,强烈建议依赖 using 语句(或者,至少在完成后使用 Dispose() Repository 实例)。

如果您不这样做,当您的 AppDomain 已卸载时,这些句柄最终将通过终结器释放,但您将无法真正控制“何时”发生。

编辑:再次阅读您的代码,我忽略了一些东西。推荐的模式是

using (var repo = new LibGit2Sharp.Repository(path))
{
    // Do amazing stuff
}

var repo = new LibGit2Sharp.Repository(path);
// Do amazing stuff
repo.Dispose();

确实,一旦代码到达作用域的末尾,using 语句将automatically发出对Dispose() 的调用。

对路径“c16566a7-202a-4c8a-84de-3e3caadd5af9”的访问被拒绝。

关于这一点,我认为这与LibGit2Sharp无关。

进程(试图删除以 guid 命名的文件夹)是否在被授予足够权限的身份下运行?

【讨论】:

  • 你是对的,Dispose() 方法工作正常,我没有足够的权限删除文件夹。非常感谢!
【解决方案2】:

为了其他遇到此问题的人的利益:

我遇到了同样的问题,但即使我以管理员身份运行,我仍然收到UnauthorizedAccessException,并且我正在正确处理存储库对象。原来.git文件夹中的一些文件被标记为ReadOnly,所以我不得不循环遍历每个文件,删除之前删除ReadOnly属性。我写了一个自定义方法来做到这一点:

/// <summary>
/// Recursively deletes a directory as well as any subdirectories and files. If the files are read-only, they are flagged as normal and then deleted.
/// </summary>
/// <param name="directory">The name of the directory to remove.</param>
public static void DeleteReadOnlyDirectory(string directory)
{
    foreach (var subdirectory in Directory.EnumerateDirectories(directory)) 
    {
        DeleteReadOnlyDirectory(subdirectory);
    }
    foreach (var fileName in Directory.EnumerateFiles(directory))
    {
        var fileInfo = new FileInfo(fileName);
        fileInfo.Attributes = FileAttributes.Normal;
        fileInfo.Delete();
    }
    Directory.Delete(directory);
}

【讨论】:

  • 谢谢,这也是我的问题。我不想使用递归方法使用也可以使用this答案中的代码。
  • 谢谢!发现您的答案几乎令人绝望,它使我免于花费数天时间重写我的应用程序以将 TMP 文件夹用于 git repos! ^_^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多