我想删除使用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)?
答案 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命名的文件夹)?