随着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控件显示当前路径
|