讀者“翔”詢問如何於asp.net中刪除目錄

原發問問題:

 

asp.net 刪不了目錄

Dim file() As FileInfo = My.Computer.FileSystem.GetDirectoryInfo("Server.MapPath("." & "/temp/"").GetFiles()

For i As Integer = 0 To file.Length - 1
    My.Computer.FileSystem.DeleteFile(file(i).FullName)
Next

 

解答:

 

親愛的讀者您好,很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆如下:

由您的程序代碼來推斷,您可能是想要刪除 ASP.NET 應用程序目錄下之 temp 子目錄內含的所有文件(不包含 temp 子目錄本身)。此時,可以使用 My.Computer.FileSystem.GetFiles 方法,來取得該目錄中文件的字符串集合。接着藉由 For Each 循環並搭配使用 My.Computer.FileSystem.DeleteFile 方法,即可刪除該目錄中的每一個文件。如下所示即是一例:

Dim strPath As String = Server.MapPath("./temp/")
Dim strFiles As _
  System.Collections.ObjectModel.ReadOnlyCollection(Of String)
Try
  ' 刪除文件。
  strFiles = My.Computer.FileSystem.GetFiles(strPath)
  For Each foundFile As String In strFiles
    My.Computer.FileSystem.DeleteFile(foundFile)
  Next
Catch ex As Exception
  ' 撰寫您所要的錯誤處理程序。
End Try

但由您發問的問題主題來看,似乎是希望刪除位於應用程序中的 temp 這個目錄。這時候只需叫用 My.Computer.FileSystem.DeleteDirectory 方法,便可一次刪除特定的目錄,如下所示即是一列:

Dim strPath As String = Server.MapPath("./temp/")
Try
' 刪除該目錄。
My.Computer.FileSystem.DeleteDirectory(strPath, _
  FileIO.DeleteDirectoryOption.DeleteAllContents)
Catch ex As Exception
  ' 撰寫您所要的錯誤處理程序。
End Try

請特別注意,叫用 My.Computer.FileSystem.DeleteDirectory 方法時,至少需要傳入兩個參數。以本例而言,第一個參數是所欲刪除的目錄,第二個參數是指定如果要刪除的目錄包含文件或子目錄時,應該連同此目錄的內含的文件或子目錄一併刪除。

假如,您希望通過 For ... To ... Next 循環來刪除 ASP.NET 應用程序目錄下之 temp 子目錄內的所有文件。使用 System.IO.File.Delete 方法似乎是比較好的作法。值得注意的是,ASP.NET 不允許我們直接刪除一個非空的目錄,亦即該目錄中,不能再內含其它文件或子目錄。如果所欲刪除之目錄尚存在其它文件或子目錄時,將會觸發System.IO.IOException: 目錄不是空的”錯誤訊息。因此在刪除某個目錄之前,必須先檢查該目錄是否存有其它文件或子目錄,如果存在其它文件或子目錄時,必須要先將他們刪除,最後再刪除我們所先前指定的目錄。

爲了方便刪除目錄作業的進行,我們撰寫了一個DeleteADirectory函式,用來刪除某個目錄,以便於其中再次呼叫該函式(亦即通過遞迴呼叫的技巧),來刪除該目錄中的其它子目錄:

Private Function DeleteADirectory( _
  ByVal strPath As String) As Boolean
  Dim strTemp() As String
  Dim intCtrl As Integer
  Try
    ' 刪除文件。
    strTemp = _
      System.IO.Directory.GetFiles(strPath)
    For intCtrl = 0 To UBound(strTemp)
      System.IO.File.Delete(strTemp(intCtrl))
    Next
    ' 刪除子目錄。
    strTemp = _
      System.IO.Directory.GetDirectories(strPath)
    For intCtrl = 0 To UBound(strTemp)
      DeleteADirectory(strTemp(intCtrl))
    Next
    ' 刪除該目錄。
    System.IO.Directory.Delete(strPath)
    Return True
  Catch ex As Exception
    Return False
  End Try
End Function

如圖表1所示,是我們在「方案總管」中所看到的項目目錄架構。接着,我們使用上述三種方式分別刪除 ASP.NET 應用程序目錄下之 temp1 目錄內的所有文件、刪除 temp2 目錄與其內含的文件或子目錄、刪除 temp3 目錄與其內含的文件或子目錄(其執行畫面與結果如圖表2所示)。

最後,提醒大家,欲讓 ASP.NET 成功刪除某個目錄(與其內含的文件、子目錄),請確認已經使用文件總管給予該目錄 ASPNET 這個本機之機器賬號(Machine Account)適當的權限。如圖表3、圖表4、圖表5所示,考慮系統安全,避免權限擴張,我們在正式上線運作的環境,不會給予 ASPNET 本機機器賬號「完全控制」的權限,但請至少賦予 ASPNET 對該特定目錄「修改」的權限,以便順利刪除特定目錄(與其內含的文件、子目錄)。
                     圖表1
                                     圖表2
                                  圖表3
                                           圖表4
                           圖表5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章