本文英文原版:
http://aspnet.4guysfromrolla.com/articles/052803-1.aspx
用DataGrid展示目录下的文件 (第一部分)
导言:
在某些情况下,我们需要在网站开发界面里展示服务器文件系统的信息。比如我们想提供一个“控制面板”供用户编辑他们的文章。
在传统的ASP程序里,要访问文件系统,开发者需要使用FileSystemObject library(更多详细信息请参考ASPFAQs.com网站的FileSystemObject FAQ Category部分),而在.NET里,System.IO命名空间里有一系列的类可以访问文件系统。
在ASP.NET里访问文件系统与在ASP里一样容易,使用ASP.NET的优势在于显示文件系统信息。就像将在本文看到的那样,文件系统信息可以绑定到任何的数据Web控件,比如DataGrid
DataList或Repeater。那意味着我们花最少的时间就可以将信息美观地展示出来。
考察用ASP.NET访问文件系统
在.NET Framework里,有2个类可以访问目录信息:Directory class和DirectoryInfo class类;也有另2个类访问文件信息:File class和FileInfo class类。
这2种类的区别在于用法不同以及返回信息的层次不同。Directory 和 File class类属于静态类,那意味着你不用先创建一个类实例然后再调用类的方法。这在你想快速执行一些与目录相关的函数时很有用。比如,要删除一个文件,你可以使用File.Delete(filePath); 要判断是否存在一个目录,可以使用Directory.Exists(directoryPath).
而FileInfo 和 DirectoryInfo class类,我们要先创建一个类的实例,并指定文件或目录的名字。比如,要使用FileInfo class类删除一个文件,你应该使用下面的代码:
Dim myFile as FileInfo = New FileInfo(filePath)
myFile.Delete()
获取一个目录下文件的列表
Directory 和 DirectoryInfo class类都包含一个方法来获取某个目录下的所有文件(或目录下与某些通配符表达式相匹配的所有文件,比如*.htm)。该方法就是GetFiles() ,用法如下:
' --- Directory Example ----
Dim files() as String = Directory.GetFiles(directoryPath,[optiona] WildCard])
' --- DirectoryInfo Example ----
Dim myDir as DirectoryInfo = New DirectoryInfo(directoryPath)
Dim fileInfos() as FileInfo = myDir.GetFiles([optiona] WildCard])
就像你看到的那样,Directory.GetFiles()方法接受1到2个参数。你必须指定要获取文件的目录的路径;而wildcard path(比如*.aspx),可以指定也可以不指定。该方法返回一个字符串数组,包含的是目录里的文件名。而DirectoryInfo.GetFiles()方法不需要目录路径参数因为已经知道了目录的路径;与Directory.GetFiles()方法不同,DirectoryInfo.GetFiles() 方法返回的是FileInfo对象(FileInfo objects)数组,而不是字符串数组。
在DataGrid里显示某个目录下的文件
为了在DataGrid(DataList或Repeater)控件里显示一个目录下的文件,我们需要做的是将DataGrid控件的DataSource属性赋值为String数组或FileInfo数组,然后调用DataGrid控件的DataBind()方法。在本例,我们用DirectoryInfo.GetFiles()方法,而不是Directory.GetFiles()方法。如果我们使用Directory.GetFiles()方法,我们只能在DataGrid控件里显示文件的文件名,而使用DirectoryInfo.GetFiles()的话我们还可以展示文件的其它特征,比如文件大小,最近修改时间等等。
<%@ Import Namespace="System.IO" %>
<script language="VB" runat="server">
Sub Page_Load(sender as Object, e as EventArgs)
Dim dirInfo as New DirectoryInfo(Server.MapPath(""))
articleList.DataSource = dirInfo.GetFiles("*.aspx")
articleList.DataBind()
End Sub
</script>
<asp:DataGrid runat="server" id="articleList" Font-Name="Verdana"
AutoGenerateColumns="False" AlternatingItemStyle-BackColor="#eeeeee"
HeaderStyle-BackColor="Navy" HeaderStyle-ForeColor="White"
HeaderStyle-Font-Size="15pt" HeaderStyle-Font-Bold="True">
<Columns>
<asp:HyperLinkColumn DataNavigateUrlField="Name" DataTextField="Name"
HeaderText="File Name" />
<asp:BoundColumn DataField="LastWriteTime" HeaderText="Last Write Time"
ItemStyle-HorizontalAlign="Center" DataFormatString="{0:d}" />
<asp:BoundColumn DataField="Length" HeaderText="File Size"
ItemStyle-HorizontalAlign="Right"
DataFormatString="{0:#,### bytes}" />
</Columns>
</asp:DataGrid>
正如以上示例代码显示的那样,为了将目录下的文件绑定到ASP.NET页面的DataGrid控件,我们只需要简单地将DataGrid的DataSource属性设为GetFiles()方法返回的结果。特别的,以上示例代码将某个目录下后缀为.aspx的文件显示出来,而这个目录就是这个ASP.NET Web页面自身所在的目录。
要将FileInfo class类的某个具体属性显示在DataGrid控件的某个列,只需要相应的设置该列的属性即可。比如,要将FileInfo.Length属性显示在最后一个BoundColumn,我们将该BoundColumn的DataField属性设置为Length.
目前,我们探究的仅仅是将目录下的文件显示出来,如何允许用户通过点击一个按钮来删除一个文件呢?我们在第2部分在讨论。