12.3 目录操作
磁盘中的文件过多时会将它们分类,将相同功能的文件放在同一个目录中。在ASP.NET中,通常使用Directory类和DirectoryInfo类操作目录。
Directory是一个静态类,该类提供了一系列操作目录的静态方法。DirectoryInfo是一个实例类,调用其实例方法可以有效地对一个目录进行操作。
12.3.1 获取目录基本信息
DirectoryInfo类包含13个属性,如表12-4所示。
表12-4 DirectoryInfo类的13个属性
【范例11】
在页面后台的Load事件中添加代码,如果F磁盘下的mytest目录存在,则获取该目录的基本信息,如创建时间、完整路径和目录名称等。代码如下。
protected void Page_Load(object sender, EventArgs e) { DirectoryInfo di = new DirectoryInfo(@"F:\mytest"); if (di.Exists) Response.Write("目录创建时间:" + di.CreationTime. ToShort Date String()+"<br/>完整路径:" + di.FullName + "<br/>最后一次访问时间:" + di.LastAccessTime + "<br/>最后一次修改时间:" + di.LastWriteTime+ "<br/>目录名称:" + di.Name + "<br/>父目录:" + di.Parent + "<br/>所在驱动器:" + di.Root.ToString()); }
12.3.2 判断目录是否存在
判断目录是否存在时有两种方式:一种是通过DirectoryInfo类的Exists属性,如范例11;另一种是通过Directory类的Exists()方法。Exists()方法的语法形式如下。
bool Directory.Exists(string path) //path表示要测试的路径
【范例12】
更改范例11的代码,通过Directory类的Exists()方法判断目录是否存在。代码如下。
DirectoryInfo di = new DirectoryInfo(@"F:\mytest"); if (Directory.Exists(@"F; \mytest")) Response.Write("目录创建时间:" + di.CreationTime.ToShortDateString() +"<br/>完整路径:" + di.FullName + "<br/>最后一次访问时间:" + di. LastAccessTime + "<br/>最后一次修改时间:" + di.LastWriteTime + "<br/>目录名称:" + di.Name + "<br/>父目录:" + di.Parent + "<br/>所在驱动器:" + di.Root.ToString());
12.3.3 创建目录
Directory类中的CreateDirectory()方法可以创建目录。两种形式如下。
CreateDirectory(string path) CreateDirectory(string path, DirectorySecurity directorySecurity)
其中,path参数指定要创建的目录路径,它可以是绝对路径或相对路径;directorySecurity参数应用指定的Windows安全性。
DirectoryInfo类的Create()方法直接创建目录。除了这个方法外,还可以通过CreateSubdirectory()方法在指定的路径中创建一个或者多个子目录。CreateSubdirectory()方法的基本语法如下。
DirectoryInfo DirectoryInfo.CreateSubdirectory(string path)
其中,path参数表示指定的路径,它不能是另一个磁盘卷或者“统一命名约定”(UNC)名称。
【范例13】
通过if语句判断E磁盘下是否存在MyInfoList目录,如果存在则创建一个名称为“我的照片”的子目录,否则创建MyInfoList目录。代码如下。
DirectoryInfo di = new DirectoryInfo(@"E:\MyInfoList"); if (di.Exists) di.CreateSubdirectory("我的照片"); else di.Create();
12.3.4 删除目录
Directory类的Delete()方法可以直接删除指定的目录。它的两种形式如下。
void Directory.Delete(string path) //从指定路径删除空目录 //删除指定的目录并(如果指示)删除该目录中的所有子目录和文件 void Directory.Delete(string path, bool recursive)
其中,path表示要移除的空目录的名称,这个目录必须可写或者为空。recursive是一个布尔值,如果要删除path中的目录、子目录和文件,则为true;否则为false。
DirectoryInfo类的Delete()方法也可以删除目录。它的两种形式如下。
void DirectoryInfo.Delete() void DirectoryInfo.Delete(bool recursive)
【范例14】
判断E磁盘下是否存在MyInfoList目录,如果存在直接调用Delete()方法删除,并且删除该目录下的所有子目录和文件。代码如下。
DirectoryInfo di = new DirectoryInfo(@"E:\MyInfoList"); if (di.Exists) di.Delete(true);
12.3.5 遍历目录
遍历目录是指获取指定目录下的子目录和文件,如用户删除目录时可以首先遍历目录中的内容,判断该目录下是否包含其他子目录和文件。遍历目录涉及Directory和DirectoryInfo类中的多个方法,与Directory类有关的遍历方法如下。
(1)GetDirectories()方法:返回指定目录中子目录的名称。
(2)GetFiles()方法:返回指定目录中文件的名称。
(3)GetFileSystemEntries()方法:返回指定目录中所有文件和子目录的名称。
与DirectoryInfo类有关的遍历方法如下。
(1)GetDirectories()方法:返回当前目录的子目录。
(2)GetFiles()方法:返回当前目录的文件列表。
(3)GetFileSystemInfos()方法:返回表示某个目录中所有文件和子目录的强类型FileSystemInfo项的数组。
【范例15】
遍历当前应用程序下DirectoryOper目录下所有子目录和文件。步骤如下。
(1)在表单元素中创建表格元素,代码如下。
<table width="90%"> <thead> <tr><td width="30%">名称</td><td width="30%">类型</td><td>创建日期 </td></tr> </thead> <tbody id="tbody" runat="server"></tbody> </table>
(2)在后台页面的Load事件中添加代码,调用DirectoryInfo类的GetFileSystemInfos()方法获取指定目录下的所有子目录和文件,然后进行遍历。代码如下。
DirectoryInfo di = new DirectoryInfo(Server.MapPath("~") + "DirectoryOper"); if (di.Exists) { //如果查看的目录存在 FileSystemInfo[] sysList = di.GetFileSystemInfos(); //获取目录的子目录和文件 string info = ""; foreach (FileSystemInfo item in sysList) { //遍历获取到的目录 if (item is DirectoryInfo) //如果是文件夹 info+="<tr><td>"+item.Name+"</td><td>文件夹</td><td>"+item.CreationTime+"</td>"; else //如果是文件 info+="<tr><td>"+item.Name+"</td><td>"+item.Extension+"文件</td><td>"+item.CreationTime+"</td>"; } tbody.InnerHtml = info; } else tbody.InnerText = "很抱歉,您要查看的目录并不存在。";
(3)运行页面查看效果,如图12-3所示。
图12-3 遍历目录
提示
除了对目录进行创建、删除和遍历等操作外,还可以对目录进行移动、复制等操作,这里不再详细解释。