[英]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.