2014-08-28 70 views
3

我想删除使用LibGit2Sharp从远程存储库克隆的本地repo文件夹。 我读here在这里,我必须Dispose()仓库之前,我可以删除它,但它仍然不能正常工作。以编程方式删除LibGit2Sharp本地存储库

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

您的'path'文件夹有一个Guid,而不是文件夹路径。它来自哪里?另外,'我在这里读到我必须Dispose()'这里到底在哪里?你忘了链接了吗? – 2014-08-28 13:21:13

+0

我在问题中添加了更多信息。 – 2014-08-28 14:10:21

+0

两件事:1)你是否执行了足够的privlidges这个代码(即作为管理员?)2)在'DeleteFolder'代码前添加代码'if(Directory.Exists(path))'以确保该目录是实际的那里。 – 2014-08-28 14:25:15

回答

1

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

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

因此,强烈建议依赖于using声明(或者,至少在Dispose()存储库实例完成后)。

如果你不这样做,那么当你的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命名的文件夹)吗?

+0

你是对的,Dispose()方法工作正常,我没有足够的权利来删除文件夹。非常感谢你! – 2014-08-29 12:37:00

13

对于其他任何人有这个问题的好处:

我有同样的问题,但我仍然得到了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

谢谢,那也是我的问题。 我你不想使用递归方法使用,也可以使用[this](http://stackoverflow.com/a/8714329/350384)的代码来回答。 – 2015-10-16 09:00:52

+0

谢谢!发现你的答案几乎绝望,它使我从花费时间重写我的应用程序,利用TMP文件夹进行git回购!^_ ^ – 2016-05-29 20:04:22