| 
				 随着Internet的发展,网络硬盘(或称网络空间)也逐渐被人们熟悉并得到广泛应用。那么,什么是网络硬盘呢?网络硬盘就是指将文件存储到服务器中,并对文件进行管理。对于普通用户,网络硬盘仅针对服务器上的某一文件夹;而对于管理员,则包括服务器中所有的硬盘分区及所有的文件。 
通常,网络硬盘的功能包括浏览文件/文件夹、删除文件/文件夹、创建文件夹和上传下载文件等。 
一、知识准备 
1.母版页 
为了给访问者一致的感受,每个网站都需要具有统一的风格和布局。如:整个网站都有相同的网页头尾、导航栏、功能条等。对于这一点,不同的技术发展阶段有不同的实现方法。ASP.NET2.0使用的母版页技术,从而能快速创建风格一致的应用程序。 
ASP.NET2.0在实现网站一致性的过程中,必须包括两种文件:一种是母版页,另一种是内容页。母版页(.master)封装页面中的公共元素;内容页(.aspx)包含除母版页之外的其他非公共内容。在运行过程中,ASP.NET引擎将两种页面内容合并执行,最后将结果发给客户端浏览器。 
2.System.IO命名空间 
System.IO命名空间中包含用于在文件中读写数据的类。针对此项应用,笔者将用到以下类及其相应的属性和方法: 
Directory类:静态实用类,提供许多静态方法,用于创建、复制、移动和删除目录的操作。 
DirectoryInfo类:公开用于创建、移动和枚举目录和子目录的实例方法。 
File类:静态实用类,提供许多静态方法,用于创建、复制、移动和删除文件的操作。 
FileInfo类:提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。 
Path类:静态实用类,提供对包含文件或目录路径信息的 String 实例执行操作。 
3.DataTable控件 
此项目将在内存中建立下面结构的数据表,用于存储目录及文件信息。 
| 
 name  | 
 size  | 
 extension  | 
 createtime  | 
 lasttime  | 
 fullname  | 
 filetype  |  
| 
    | 
    | 
    | 
    | 
    | 
    | 
    |    
name字段用于存储文件名称,对于文件夹来说,该字段还包括了相应的链接信息;size字段用于存储文件的大小,对于文件夹而言,该字段为空;extension字段存储文件的扩展名;createtime表示文件或文件夹的创建时间;lasttime字段表示文件或文件夹的最后修改时间;fullname字段表示文件或文件夹的完整路径;filetype表示此条信息的类型,1表示文件,0表示文件夹。 
4.数据绑定 
数据绑定是指将数据对象和窗口中的界面对象(比如控件)结合,使对象的值自动动态地在控件中显示。 
(1)       绑定到控件 
diskInfo disktable = new diskInfo(theDir);   //生成指定目录的数据表 
   GridView1.DataSource = disktable.GetdTable;  //设置GridView数据源 
   GridView1.DataBind();                        //数据绑定 
(2)数据绑定表达式“<%# %>” 
当在页上调用 DataBind 方法时,数据绑定表达式创建控件属性和数据源之间的绑定,代码如下: 
<a href='<%# "Upload.aspx?thedir="+HttpUtility.UrlEncode(lblPath.Text)%>'> [上传文件]</a> 
5.GridView数据控件 
GridView数据控件用于绑定数据表数据,显示浏览结果。其设置关键在于模板的编辑,VS2005中通过智能标签可轻松完成。定义代码如下: 
<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" Width="98%"> 
         <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
         <Columns> 
             <asp:TemplateField HeaderText="文件名"> 
                <ItemTemplate> 
                    <%# DataBinder.Eval(Container.DataItem,"name") %> 
                </ItemTemplate> 
             </asp:TemplateField> 
             <asp:BoundField DataField="size" HeaderText="大小" /> 
             <asp:BoundField DataField="extension" HeaderText="类型" /> 
             <asp:BoundField DataField="createtime" HeaderText="创建时间" /> 
             <asp:BoundField DataField="lasttime" HeaderText="最后修改时间" /> 
             <asp:TemplateField HeaderText="操作"> 
                <ItemTemplate> 
                    <asp:HyperLink ID="HyperLink1" runat="server" ImageUrl="image/down.gif"   
NavigateUrl='<%# "Main.aspx?type=down&thedir= 
"+HttpUtility.UrlEncode(Convert.ToString(DataBinder.Eval(Container.DataItem,"fullname")))  
%>' Visible='<%# Convert.ToInt16(DataBinder.Eval(Container.DataItem,"filetype")) 
==1?true:false %>'>下载文件</asp:HyperLink>       
                    <asp:HyperLink ID="HyperLink2" runat="server" ImageUrl="image/delete.gif"  
NavigateUrl='<%# "Main.aspx?type=delete&thedir= 
"+HttpUtility.UrlEncode(Convert.ToString(DataBinder.Eval(Container.DataItem,"fullname")))+" 
&sign="+Convert.ToString(DataBinder.Eval(Container.DataItem,"filetype"))%>'>删除</asp:HyperLink> 
                </ItemTemplate> 
         </asp:TemplateField> 
         </Columns> 
         <RowStyle BackColor="#FFFBD6" ForeColor="#333333" /> 
         <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" /> 
         <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" /> 
         <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
         <AlternatingRowStyle BackColor="White" /> 
         <EmptyDataTemplate> 
            <center> 
                <span style="color: red">Sorry,there are no files or folders.</span></center> 
         </EmptyDataTemplate> 
 </asp:GridView> 
更多相关类、控件的信息可查阅MSDN Library获得。 
二、定义读取指定路径文件信息的类 
在项目中添加一个命名为diskInfo的类,完成读取指定路径上文件和文件夹信息,并存储在DataTable对象中。实现代码如下: 
public class diskInfo                //文件名:diskInfo.cs 
{   DataTable dTable; 
    string path;                     //存储指定的路径 
    public diskInfo(string thePath)   //构造函数,初始化path和表的数据结构 
    {   path = thePath; 
        dTable = new DataTable(); 
        dTable.Columns.Add(new DataColumn("name", System.Type.GetType("System.String")));        dTable.Columns.Add(new DataColumn("size", System.Type.GetType("System.String"))); 
        dTable.Columns.Add(new DataColumn("extension", System.Type.GetType("System.String"))); 
        dTable.Columns.Add(new DataColumn("createtime", System.Type.GetType("System.DateTime"))); 
        dTable.Columns.Add(new DataColumn("lasttime", System.Type.GetType("System.DateTime"))); 
        dTable.Columns.Add(new DataColumn("fullname", System.Type.GetType("System.String"))); 
        dTable.Columns.Add(new DataColumn("filetype", System.Type.GetType("System.Int16"))); 
    } 
    public DataTable GetdTable        //属性,返回DataTable对象 
    {   get 
        {  readDiskInfo(); 
            return dTable;  
        } 
    } 
    public void readDiskInfo() 
    {   DirectoryInfo dirObj;           //文件夹信息对象 
        DirectoryInfo[] dirObjArray;    //文件夹信息对象数组 
        FileInfo[] fileObjArray;        //文件信息对象数组 
        dirObj = new DirectoryInfo(path);//实例化指定路径的DirectoryInfo对象 
        dirObjArray = dirObj.GetDirectories(); 
        for (int i = 0; i < dirObjArray.Length; i++) 
        {   DataRow dr = dTable.NewRow();       //实例化行对象,并填充目录数据 
            dr[0] = "<a href='Main.aspx?type=browser&thedir=" + HttpUtility.UrlEncode(dirObjArray[i].FullName) + "'><img border='0' src='image/folder.gif' >" + dirObjArray[i].Name + "</a>";  //添加目录链接信息 
            dr[1] = ""; 
            dr[2] = "文件夹"; 
            dr[3] = dirObjArray[i].CreationTime; 
            dr[4] = dirObjArray[i].LastWriteTime; 
            dr[5] = dirObjArray[i].FullName; 
            dr[6] = 0; 
            dTable.Rows.Add(dr); 
        } 
        fileObjArray = dirObj.GetFiles(); 
        for (int i = 0; i < fileObjArray.Length; i++) 
        {   DataRow dr = dTable.NewRow();      //实例化行对象,并填充文件数据 
            dr[0] = fileObjArray[i].Name; 
            dr[1] = fileObjArray[i].Length + "字节"; 
            dr[2] = fileObjArray[i].Extension; 
            dr[3] = fileObjArray[i].CreationTime; 
            dr[4] = fileObjArray[i].LastWriteTime; 
            dr[5] = fileObjArray[i].FullName; 
            dr[6] = 1; 
            dTable.Rows.Add(dr); 
        } 
    } 
} 
三、浏览文件 
这是网络硬盘最基本,最重要的功能,其他功能都是以此界面为基础。如图1:包括驱动器选择、子目录浏览、返回上级目录、删除文件/文件夹、创建文件夹、下载文件、上传文件。这些功能都是通过相应的链接串在一起。 
 
  
 
图1 浏览文件和文件夹 
如图1所示,可通过两种方式浏览文件。一是选择驱动器,可浏览该驱动器下所有的文件夹及文件;二是单击相应的文件夹链接,可浏览该文件夹下的所有子目录及文件。 
选择驱动器采用了DropDownList控件(实例名为:driverNameList),在Page_Load中编写如下代码: 
if (!Page.IsPostBack) 
        {   string[] arrayDriverName;  //存储逻辑驱动器名字符数组 
            arrayDriverName = System.IO.Directory.GetLogicalDrives(); 
            driverNameList.Items.Add(new ListItem("请选择...", "0"));  //初始化DropDownList控件 
            for (byte i = 1; i <= arrayDriverName.Length; i++) 
            {   ListItem theItem = new ListItem(arrayDriverName[i-1], i.ToString()); 
                driverNameList.Items.Add(theItem); 
            } 
  …… 
        } 
protected void driverNameList_SelectedIndexChanged(object sender, EventArgs e)//显示指定驱动器信息 
    {   if (driverNameList.SelectedIndex != 0) 
        {  diskInfo disktable = new diskInfo(driverNameList.SelectedItem.Text); 
           GridView1.DataSource = disktable.GetdTable; 
           GridView1.DataBind(); 
           lblPath.Text = driverNameList.SelectedItem.Text;   //Label控件显示当前路径 			
				 |