读者“翔”询问如何于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
相关文章
相关标签/搜索