2011-05-26 95 views
0

我暫時將一個.zip文件解壓縮到磁盤,我想稍後刪除所有這些文件。在測試期間,我在這個過程中提取了一些TortoiseSVN元數據文件夾。當我的應用程序稍後試圖刪除它時,它的失敗是UnauthorizedAccessException
我認爲這是由於TSVNCache監視文件系統並在我想刪除該文件夾時鎖定該文件夾。C#阻止其他進程鎖定您的文件/文件夾

我該如何防止類似的東西?

編輯:下面是一些代碼來說明這個問題好一點:

public class Package : IDisposable { 

    private bool _disposed; 

    public string Filename { get; set; } 

    public DirectoryInfo RootFolder { get; set; } 

    public Package(string filename, DirectoryInfo rootFolder) { 
     Filename = filename; 
     RootFolder = rootFolder; 
    } 

    public static Package Expand(string packageFileName, DirectoryInfo targetDirectory) { 
     FileInfo packageFile = new FileInfo(packageFileName); 

     string publicKey  = Settings.Default.PublicKey; 
     byte[] publicKeyBytes = Convert.FromBase64String(publicKey); 

     byte[] packageBytes   = File.ReadAllBytes(packageFile.FullName); 
     byte[] decryptedPackageBytes = Blob.DecryptBlob(packageBytes, publicKeyBytes, false); 

     // Write result 
     string outputFolderName = targetDirectory.FullName; 
     Directory.CreateDirectory(outputFolderName); 

     ZipFile zipFile = ZipFile.Read(decryptedPackageBytes); 
     zipFile.ExtractAll(outputFolderName); 

     Package result = new Package(packageFile.FullName, new DirectoryInfo(outputFolderName)); 
     return result; 
    } 

    ~Package() { 
     Dispose(false); 
    } 

    public void Dispose() { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool disposing) { 
     if(_disposed) { 
     return; 
     } 
     if(disposing) { 
     RootFolder.Delete(true); 
     } 
     // Dispose unmanaged resources. 
     _disposed = true; 
    } 
    } 

我會用Package.Expand在使用塊,並通過他們訪問那裏提取的文件(目前我只是循環和打印他們的名稱到控制檯)。當該塊退出並調用Dispose時,我得到關於all-wcprops的異常。其他,非svn相關的文件被刪除。

回答

0

你確定你正確地處理了你的句柄,並且該用戶的應用程序正在運行,因爲它有權刪除它嗎?

+0

創建該文件的用法與嘗試刪除該文件的用法相同。這一切都完成了相同的應用程序。它對其他文件也很好。我只注意到了SVN文件的這種行爲。 – 2011-05-26 14:53:44

0

我有與tortiose-Git相同的問題。

時,我有一個鎖定的問題,我使用任務管理器殺TGitCache重新開始TGitCache進程(或者你的情況TSVNCache處理)

在短暫的停頓後,我可以繼續使用恩烏龜。

你也可以認爲excluding certain directories from tortois-svn supervision

+0

好吧,這並不會在我的開發機器上造成問題。我只是擔心客戶機上的這種行爲。我真的希望能夠刪除這些文件(並沒有其他應用程序觸摸它們)。 – 2011-05-26 15:20:35

+0

客戶端機器將不會安裝烏龜:-)您可以通過在創建後獨自鎖定文件或通過不允許其他進程通過acls – k3b 2011-05-26 15:29:08

+0

來讀取文件來阻止鎖定。我的問題並不是專門針對SVN文件。這只是一個例子(我注意到這可能是一個普遍問題)。我會看看我可以挖掘關於ACL的內容;) – 2011-05-26 15:35:44

0

可以使用的CreateFile WIN32 API(通過P/Invoke的),打開一個目錄句柄與ShareMode設置爲0,則沒有其他進程將能獲取該目錄的句柄。

+0

是否沒有託管對等項? 'FileShare.None'似乎甚至阻止我自己的進程打開目錄/文件(根據文檔)。 – 2011-05-28 11:31:34

相關問題