繁体   English   中英

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

[英]Programmatically delete local repository with LibGit2Sharp

我想删除使用LibGit2Sharp从远程存储库克隆的本地repo文件夹。 这里读到,我必须在删除它之前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)?

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

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

我想删除使用LibGit2Sharp从远程存储库克隆的本地repo文件夹。 我在这里读到,在删除它之前我必须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语句将自动发出对Dispose()的调用。

访问路径'c16566a7-202a-4c8a-84de-3e3caadd5af9'被拒绝。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM