使用LibGit2Sharp以编程方式删除本地存储库

时间:2014-08-28 13:07:21

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

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

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

Directory.DeleteFolder(path);

我还有一个例外:

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

'路径的内容'变量如下:

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

此文件夹由辅助角色创建到本地存储。

如何删除整个文件夹(包括.git)?

2 个答案:

答案 0 :(得分:20)

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

我遇到了同样的问题,但即使我以管理员身份运行,我仍然得到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);
}

答案 1 :(得分:2)

  

我想删除使用LibGit2Sharp从远程存储库克隆的本地repo文件夹。我在这里读到,在删除之前我必须Dispose()存储库。

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

因此,确实强烈建议依赖using语句(或者至少在Dispose()存储库实例时使用它)。

如果你不这样做,那么当你的AppDomain卸载时,这些句柄最终将通过终结器释放,但是你不会真正控制&#34;当&#34;这将会发生。

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

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

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

确实,using语句将 automatically 在代码到达范围结束时发出对Dispose()的调用。

  

访问路径&#39; c16566a7-202a-4c8a-84de-3e3caadd5af9&#39;被拒绝。

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

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