2010-09-23 13 views
3

我最近遇到了My.Computer.FileSystem.DeleteDirectory()的問題。它不會刪除只讀文件。帶有隻讀文件的My.Computer.FileSystem.DeleteDirectory()?

我通過谷歌搜索發現,我可以通過將文件屬性更改爲「正常」來刪除只讀文件。所以我寫了一個遞歸函數,如下所示。

Private Sub DeleteDir(ByVal dir As DirectoryInfo) 

    For Each d In dir.GetDirectories 
     DeleteDir(d) 
    Next 
    For Each f In dir.GetFiles 
     Try 
      f.Attributes = FileAttributes.Normal 
      f.Delete() 
     Catch ex As Exception 
      Log(ex.Message) 
     End Try 
    Next 
    dir.Delete(True) 
End Sub 

它似乎做工精細,但它會很好,如果My.Computer.FileSystem.DeleteDirectory()有另外的參數刪除只讀文件,或有一個更簡單的方法來做到這一點。

回答

1

我的理解是,My命名空間中的類部分意味着對新開發人員(可能具有VB6背景)的柺杖,它會發現.Net框架有點壓倒性。如果他們讓My命名空間太大,我認爲它會打破更容易找到事物的目的。我還假設它們可能有限的資源來構建該命名空間,並且必須是非常有選擇性的。

解決方案是讓您按照自己的方式完成並編寫自己的方法,然後將其放入類庫或其他類似的幫助函數中,然後您可以輕鬆地將其包含在所有項目中。

順便說一句,記住dir.Delete(True)也可以拋出異常。

2

簡短的答案是框架中沒有提供方法。你必須開發自己的。你寫的是好的。我更喜歡以下內容,因爲它使用了擴展方法,並更清楚地描述了該方法的作用。

Imports System 
Imports System.IO 
Imports System.Runtime.CompilerServices 
Imports System.Linq 

Public Module DirectoryExtensions 

    <Extension()> 
    Public Sub Delete(directory As DirectoryInfo, 
         recursive As Boolean, 
         forceReadOnlyDelete As Boolean 
    ) 
     directory.ForceDelete() 
    End Sub 

    <Extension()> 
    Public Sub ForceDelete(ByVal directory As DirectoryInfo) 

     directory.RemoveReadOnlyAttributeFromFiles(True) 
     directory.Delete(True) 

    End Sub 

    <Extension()> 
    Public Sub RemoveReadOnlyAttributeFromFiles(ByVal directory As DirectoryInfo, ByVal recursive As Boolean) 

     Dim readOnlyFiles = From f In directory.GetFiles() 
      Where (f.Attributes And FileAttributes.ReadOnly) = FileAttributes.ReadOnly 

     For Each file In readOnlyFiles 
      file.Attributes = FileAttributes.Normal 
     Next 

     If recursive Then 

      For Each subDirectory In directory.GetDirectories() 
       subDirectory.RemoveReadOnlyAttributeFromFiles(True) 
      Next 

     End If 

    End Sub 

End Module 
+0

謝謝蒂姆,我通過你的文章瞭解了一些關於擴展。多態化當前的Delete並添加一個額外的布爾參數「force_read_only_delete」或類似的東西會很好。你可以通過擴展多形?這可能是另一個問題:) – Rots 2010-09-24 05:49:51

+0

是的,你可以。我已經爲現有代碼添加了一個示例。 – 2010-09-24 08:21:43