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

摘要:讀者「翔」詢問如何於 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

 

 

章立民研究室 2007/5/1