2014-08-28 71 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