摘要:讀者「翔」詢問如何於 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
章立民研究室