惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
S
Securelist
博客园 - Franky
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
IT之家
IT之家
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
AI
AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Schneier on Security
Schneier on Security
Attack and Defense Labs
Attack and Defense Labs
Vercel News
Vercel News
腾讯CDC
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
量子位
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
Cyberwarzone
Cyberwarzone
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
N
News and Events Feed by Topic
T
Tenable Blog
PCI Perspectives
PCI Perspectives
MyScale Blog
MyScale Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
W
WeLiveSecurity
N
News | PayPal Newsroom
P
Proofpoint News Feed
O
OpenAI News
C
CERT Recently Published Vulnerability Notes
B
Blog
Cisco Talos Blog
Cisco Talos Blog
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Spread Privacy
Spread Privacy

博客园 - 银狐

蓝屏故障解决(经典) 生命的十字架 用户中心 - 博客园 怎样清除不干胶? 系统每次开机都自检分类 在supesite资讯页里加入画中画广告 - 银狐 - 博客园 MYSQL替换语句 如何鉴别IBM T40成色 iP1000废弃墨水吸收器已满解决方法 xp下删除vista文件夹的方法 可以绕过MYIE弹出窗口过滤的弹窗JS代码 强力逃避拦截的弹窗代码 突破网易相册的反盗链 相对路径连接access数据库 javascript的页面跳转代码 饭后八件事最谋杀健康 USB2.0技术 长途每分钟只要9分钱! 宽带拨号错误详解
如何用Asp.Net来实现“网络硬盘”功能
银狐 · 2007-08-13 · via 博客园 - 银狐

所谓“网络硬盘”,即将服务器的磁盘空间提供给用户使用,用户可以通过这种方式在互联网上实现文件的转移和备份。通过网络硬盘,不仅可以备份电脑系统文件,且可以轻松实现移动化办公,你可以随时随地进行个人文件的上传、下载、删除及文件目录的创建、删除等操作,还可以实现文件网络共享、网络文件快递、快速下载通道等。也就是说,只要你愿意的话,就可以与网络上的所有人共享存放在网络硬盘上的文件。当然,如果自己不愿意的话,那谁也看不到你的文件。和E_Mail不同的是,网络硬盘侧重于个人文件的存储、共享、发送等各式网络文件管理。这样就可以突破E-mail的附件中对文件大小的限制。

通过了解“网络硬盘”的概念可以发现,实际上它的要求就是在客户端来完成对服务器系统文件或文件夹的访问、创建和删除等功能。而Asp.Net在这方面有着很大的优势。

本章将就如何用Asp.Net来实现“网络硬盘”功能做详细的探讨。网络硬盘的功能包括很多项,我们要提供的包括以下几个方面:

l         查看文件夹内容

l         文件夹的创建及相关属性的设置

l         文件夹间跳转

l         上传文件到指定文件夹

l         下载文件到本机或在线查看文件内容

l         删除文件或文件夹

经过本章的学习,您将能够在个人网站中提供“网络硬盘”功能,为广大的用户提供“移动秘书”服务,从而扩大自身网站的知名度。

File类和Directory类
要进行“网络硬盘”功能设计,首先要熟悉.NET中处理文件和文件夹的操作。File类和Directory类是其中最主要的两个类。了解它们将对后面功能的实现提供很大的便利。

System.IO.File类和System.IO.FileInfo类
主要提供关于文件的各种操作,使用时需要引用System.IO命名空间。下面通过程序实例来介绍其主要属性和方法。

●     文件打开File.Open

public static FileStream Open(

   string path,

   FileMode mode

);

下面的代码打开c:\tempuploads\newFile.txt文件,并写入hello。

private void OpenFile()

{

FileStream.TextFile=File.Open(@"c:\tempuploads\newFile.txt",

FileMode.Append);

byte [] Info = {(byte)'h',(byte)'e',(byte)'l',(byte)'l',(byte)'o'};

TextFile.Write(Info,0,Info.Length);

TextFile.Close();

}

●     文件创建File.Create

public static FileStream Create(

   string path

);

下面的代码创建了c:\tempuploads\newFile.txt文件。

由于File.Create方法默认向所有用户授予对新文件的完全读/写访问权限。

文件是用读/写访问权限打开的,必须关闭后才能由其他应用程序打开。

所以使用了 FileStream的Close方法将创建的文件关闭。

private void MakeFile()

{

FileStream NewText=File.Create(@"c:\tempuploads\newFile.txt");

NewText.Close();

}

●     文件删除File.Delete

public static void Delete(

   string path

);

下面的代码将c:\tempuploads\newFile.txt文件删除。

private void DeleteFile()

{

File.Delete(@"c:\tempuploads\newFile.txt");

}

●     文件复制File.Copy

public static void Copy(

   string sourceFileName,

   string destFileName,

   bool overwrite

);

下面的代码复制c:\tempuploads\newFile.txt到c:\tempuploads\BackUp.txt。

由于Cope方法的OverWrite参数设为了true,所以若BackUp.txt文件已存在,将会被复制的文件覆盖。

private void CopyFile()

{

File.Copy(@"c:\tempuploads\newFile.txt",@"c:\tempuploads\BackUp.txt",true);

}

●     文件移动File.Move

public static void Move(

   string sourceFileName,

   string destFileName

);

下面的代码将文件c:\tempuploads\BackUp.txt移动到

c:\tempuploads\BackUp2.txt

private void MoveFile()

{

File.Move(@"c:\tempuploads\BackUp.txt",@"c:\tempuploads\BackUp2.txt");

}

●     设置文件属性File.SetAttributes

public static void SetAttributes(

   string path,

   FileAttributes fileAttributes

);

下面的代码设置文件c:\tempuploads\newFile.txt的属性为只读,隐藏。

private void SetFile()

{

File.SetAttributes(@"c:\tempuploads\newFile.txt",

FileAttributes.ReadOnly|FileAttributes.Hidden);

}

文件除了只读和隐藏常用的属性还有

Archive(文件存档状态),System(系统文件),Temporary(临时文件)等

关于文件属性的详细情况请参看MSDN中FileAttributes中的描述。

●     判断文件是否存在File.Exist

public static bool Exists(

   string path

);

该代码判断是否存在c:\tempuploads\newFile.txt文件。

若存在,先复制该文件,然后其删除,最后将复制的文件移动。

若不存在,创建该文件,打开文件,写入。然后将文件属性设为只读,隐藏。

if(File.Exists(@"c:\tempuploads\newFile.txt"))  //判断文件是否存在

{

CopyFile();            //复制文件

DeleteFile();          //删除文件

MoveFile();            //移动文件

}

else

{

MakeFile();             //生成文件

OpenFile();             //打开文件

SetFile();              //设置文件属性

}

此外,File类对于Text文本提供了更多的支持

AppendText:将文本追加到现有文件

CreateText:为写入文本创建或打开新文件

OpenText:打开现有文本文件以进行读取

但上述方法主要对UTF-8的编码文本进行操作,不够灵活。

推荐以下面的代码操作

txt文件读:

StreamReader TxtReader = new StreamReader(@"c:\tempuploads\newFile.txt",System.Text.Encoding.Default);

string  FileContent;

FileContent = TxtReader.ReadEnd();

TxtReader.Close();

txt文件写:

StreamWriter = new StreamWrite(@"c:\tempuploads\newFile.txt",System.Text.Encoding.Default);

string FileContent;

TxtWriter.Write(FileContent);

TxtWriter.Close();

System.IO.Directory类和System.DirectoryInfo类
主要提供关于目录的各种操作,使用时需要引用System.IO命名空间。下面通过程序实例来介绍其主要属性和方法。

●     目录创建Directory.CreateDirectory

public static DirectoryInfo CreateDirectory(

   string path

);

下面的代码创建了c:\tempuploads\NewDirectory目录。

private void MakeDirectory()

{

Directory.CreateDirectory(@"c:\tempuploads\NewDirectoty");

}

●     目录设置

下面的代码设置c:\tempuploads\NewDirectory目录为只读,隐藏。

与文件属性相同,目录属性也是使用FileAttributes来进行设置的。

private void SetDirectory()

{

DirectoryInfo NewDirInfo = new DirectoryInfo(@"c:\tempuploads\NewDirectoty");

NewDirInfo.Atttributes = FileAttributes.ReadOnly|FileAttributes.Hidden;

}

●     目录删除Directory.Delete

public static void Delete(

   string path,

   bool recursive

);

下面的代码将c:\tempuploads\BackUp目录删除。

Delete方法的第二个参数决定是否删除非空目录。

为true时,将删除整个目录,即使该目录下有文件或子目录。

为false时,仅当目录为空时才可删除。

private void DeleteDirectory()

{

Directory.Delete(@"c:\tempuploads\BackUp",true);

}

●     目录移动Directory.Move

public static void Move(

   string sourceDirName,

   string destDirName

);

下面的代码将目录c:\tempuploads\NewDirectory移动到

c:\tempuploads\BackUp

private void MoveDirectory()

{

File.Move(@"c:\tempuploads\NewDirectory",@"c:\tempuploads\BackUp");

}

●     获取当前目录下的所有子目录Directory.GetDirectories

public static string[] GetDirectories(

   string path

);

下面的代码读出c:\tempuploads\目录下的所有子目录。将其存储到字符串数组中。

private void GetDirectory()

{

    string [] Directorys;

Directorys = Directory. GetDirectories (@"c:\tempuploads",);

}

●     获取当前目录下的所有文件Directory.GetFiles

public static string[] GetFiles(

   string path

);

下面的代码读出c:\tempuploads\目录下的所有文件。将其存储到字符串数组中。

private void GetFile()

{

    string [] Files;

Files = Directory. GetFiles (@"c:\tempuploads",);

}

●     判断目录是否存在Directory.Exist

public static bool Exists(

   string path

);

该代码判断是否存在c:\tempuploads\NewDirectory目录。

若存在,先获取该目录下的子目录和文件,然后其移动,最后将移动后的目录删除。

若不存在,创建该目录,然后将目录属性设为只读,隐藏。

if(File.Exists(@"c:\tempuploads\NewDirectory"))  //判断文件是否存在

{

GetDirectory();             //获取子目录

GetFile();                  //获取文件

MoveDirectory();            //移动目录

DeleteDirectory();          //删除目录

}

else

{

MakeDirectory();             //生成目录

SetDirectory();              //设置目录属性

}

注意:路径有三种方式,当前目录下的相对路径,当前工作盘的相对路径,绝对路径以 C:\Tmp\Book为例。(假定当前工作目录为C:\Tmp)

“Book”,”\Tmp\Book”,”C:\Tmp\Book”都表示了C:\Tmp\Book

另外,在C#中 “\”是特殊字符要表示它的话需要使用“\\”。

由于这种写法不方便,C#语言中提供了@对其简化。只要在字符串前加上@即可直接使用”\”。所以上面的路径在C#中应该表示为

“Book”,@”\Tmp\Book”,@”C:\Tmp\Book”

查看文件夹内容
就像操作本地的计算机一样,需要为每个网络用户提供各自的一块硬盘空间,用户登录后便可以对自己的空间进行管理。管理是多方面的,首先用户应该能看到自己文件夹下的所有内容,另外需要提供多级文件夹目录的支持。

下面要介绍的实例包括了“网上硬盘”的许多功能,我们将一步步为大家进行介绍。首先来创建工程实例,然后进行主界面的设计,最后对各个功能的实现进行分别介绍。

新工程创建
新工程创建的步骤如下:

1.  打开MicroSoft Visual Studio.NET应用程序

2.  选择【文件】|【新建】|【项目】,打开【新建项目】对话框,如图进行以下选择和设置:在项目类型中选择Visual C#项目,随后在右边模板中选择ASP.NET WEB应用程序,然后把对话框下面显示的位置改为http://localhost/WebDisk,单击【确定】按钮完成新项目创建。

图16.1  新建项目设置

3.  工程创建完后,将直接打开一个创建好的Web页面,名称为“WebForm1.aspx”,选择【视图】|【解决方案资源管理器】,打开【解决方案资源管理器】,这里可以对工程的所有资源进行统一管理,在这里可以看到已经刚才提到的“WebForm1.aspx”。

4.  选择【项目】|【添加新项】,打开【添加新项】对话框,在右边“模板”中选择Web窗体,左下角名称更名为“NetWorkDisk.aspx”,单击【打开】完成新项的添加。

图16.2  添加新项对话框

主界面设计
创建好工程和新项后,就要进行功能主界面的设计了。为了使用户界面更为友好易用,就需要使用很多服务器控件。下面这张图是设计好的功能界面图,我们将通过一系列步骤进行说明:

图16.3  “网络硬盘”主界面设计图

1.  选择【视图】|【工具箱】,打开【工具箱】对话框。

2.  在【服务器资源管理器】中双击“NetWorkDisk.aspx”,在页面左下角选择【设计】。然后就可以对控件进行添加了。

3.  选择【工具箱】|【HTML】,双击该目录下的【Flow Layout Panel】控件,按图1.3所示放置该对象,并在其中添加文字“网络硬盘――您的个人移动秘书”。

4.  选择【工具箱】|【WEB窗体】,双击该目录下的【Label】控件,右键点击生成的控件对象选择【属性】,对其属性进行设置:其中(ID)名称设为“Info”,(Text)属性设为空,(ForeColor)属性设为“Red”。

5.  和步骤四类似,再添加三个Label控件,把其Text属性分别设置为“目录浏览”、“文件上传”和“目录新建”,其它属性项采取默认设置。

6.  选择【工具箱】|【WEB窗体】,双击该目录下的【ListBox】控件,对生成的控件对象属性进行设置:(ID)名称设为“FileList”,再按图1.3的位置放置。

7.  添加两个【Button】类型的【WEB窗体】控件,(ID)分别设置为“BtnOpen”和“BtnDelete”,(Text)属性分别设为“打开”和“删除”。

8.  选择【工具箱】|【HTML】,双击该目录下的【File Field】控件,将其位置定位于“文件上传”之后。

9.  新增一个【TextBox】类型的【WEB窗体】控件,(ID)设置为“NewDirName”,位置位于“新建目录”之后。

10.如图还需增加“上传”和“新增目录”两个Button控件,(ID)分设为“BtnUpLoad”和“BtnNewDir”。

11.新增两个【CheckBox】类型的【WEB窗体】控件,(ID)分别设置为“chkReadOnly”和“chkHidden”,(Text)分别设为“只读”和“隐藏”。

注意:上面完成了控件的添加和页面布置工作,为了使File Field控件对象能够正常工作,还需要在Html代码中进行相关的设置。单击左下角的【HTML】按钮,找到<form id= "WebForm1" method="post" runat="server">,将其修改为<form id= "WebForm1" method="post" runat="server" EncType="multipart/form-data">,因为File Field控件只有在HtmlForm 的 Enctype属性设置为“multipart/form-data”时才起作用。

另外还要为File Field控件增加id标识,在html代码中找到:

<INPUT runat="server" style="Z-INDEX: 107; LEFT: 131px; WIDTH: 490px; POSITION: absolute; TOP: 336px; HEIGHT: 22px" type="file" size="62">

将其修改为:

<INPUT runat="server" style="Z-INDEX: 107; LEFT: 131px; WIDTH: 490px; POSITION: absolute; TOP: 336px; HEIGHT: 22px" type="file" size="62" id="WebFile" name="WebFile">

这样我们就完成了主界面的设计工作,友好的界面风格必须配备相应的代码支持。下面马上就要转入后台程序的编码了。

代码实现
在介绍“网络硬盘”概念时已经提到,每个用户在“网络硬盘”上有自己的一块空间。在下面程序设计中是这样处理的:为用户提供一个固定的文件夹,在这个文件夹下用户可以自己增加/删除新的文件夹或文件。如图1.4所示,首次打开网页时将列出该文件夹下的所有内容(包括文件和文件夹)。如果想进入下一级文件夹,可以选中该文件夹,然后单击【打开】进入。下面将就查看文件夹内容功能的实现进行分步骤说明。

图16.4  用户主界面

●     页面加载

由于我们提供的用户目录是固定的,如“c:\UserDir”,而且要求在页面加载后显示该文件夹所有内容,所以需要在Page_Load中进行相应操作:首先要判断该文件夹是否存在,如果不存在需要先创建它;然后再列出该文件夹下的内容。其代码实现如下:

private void Page_Load(object sender, System.EventArgs e)

{

     // 在此处放置用户代码以初始化页面

     if(Page.IsPostBack==false)

      {

         CurrentPath= @"c:\UserDir\";  //设置当前目录

       if(Directory.Exists(@"c:\UserDir\")==false) //若该目录不存在,创建该目录

             Directory.CreateDirectory(@"c:\UserDir\");

   LoadDir(CurrentPath);  //初始化装入目录

      }

}

LoadDir(string FullPath)方法用以列出该文件夹下的所有内容,代码如下:

private void LoadDir(string FullPath)

          {

                    CurrentPath=FullPath;

                    ArrayList values = new ArrayList();

                    string [] MyFiles,MyDirs;

                    MyFiles = Directory.GetFiles(FullPath);  //得到该目录下所有文件

                    if(CurrentPath!=@"c:\UserDir")  //若不是顶级目录,增加返回上级目录选项

                    {

                             values.Add("返回上级目录");

                    }

                    values.AddRange(MyFiles);  //加入文件

                    MyDirs= Directory.GetDirectories(FullPath);  //得到该目录下所有目录

                    values.AddRange(MyDirs);  //加入目录

                    FileList.DataSource=values;  //设定数据源

                    FileList.DataBind();  //绑定数据

          }

首先要定义一个ArrayList数组对象values,它用来存放顶级目录下的所有内容(保括文件夹名和文件名)。Directory.GetFiles()方法返回顶级目录下的所有文件名,其返回类型为一个string数组,故需要定义一个string类对象MyFiles来保存返回的文件名;Directory.GetDirectories()返回顶级目录下的所有文件夹名称,同样定义一个string数组对象MyDirs来保存它们。完成这些后就可以把MyFiles和MyDirs数组添加进values对象了。最后要做的只是为ListBox控件对象FileList添加数据源和绑定数据了。有一点需要说明:如果当前目录不是顶级目录,则需要能返回到上级目录,为此需要在FileList中添加“返回上级目录”选项。

●     多级目录查看

通过这两段代码,就可以完成在页面加载时列出顶级目录下的所有内容。当然列出顶级目录下的内容还是不够的,和Windows操作系统类似,网络硬盘中文件夹目录也是嵌套的,存在二级或者多级文件夹目录。为此要进行一些相应的处理,使得用户可以查看多级文件夹目录内容。前面界面设计中提供了一个“打开”按钮,用户选择相应的文件夹后,单击该按钮就可以查看到该文件夹下的内容。

下面就为“打开”按钮添加代码,在【设计】中双击该按钮,系统就会自动为其添加事件,代码内容如下:

private void btnOpen_Click(object sender, System.EventArgs e)

          {

                    if(FileList.SelectedItem.Text=="返回上级目录")   //返回上级目录

                    {

                             string ParentPath=Directory.GetParent(CurrentPath).ToString();

                             LoadDir(ParentPath);

                             return;

                    }

                    else    //打开目录

                   {

                             LoadDir(FileList.SelectedItem.Text);

                    }

          }

程序首先判断用户选中的是不是“返回上级目录”,如果是的话,则要先通过Directory.GetParent()方法返回上级文件夹名称,然后再调用LoadDir()方法来显示该目录下的内容;如果用户选中的不是“返回上级目录”而是一个文件夹名称,则可以直接调用LoadDir()方法,FileList.SelectedItem.Text为选中的文件夹名,用它来做为LoadDir()方法的参数。

创建新文件夹同时可设置访问权限
创建新文件夹是“网络硬盘”用户管理的一项重要内容,在创建文件夹的同时,还希望能够对文件夹的属性进行相关的设置,如“只读”或者“隐藏”等等。

界面布置
和这部分功能相关的控件包括以下几个:(ID)为“NewDirName”的TextBox控件,用户在这里输入新文件夹名;(ID)分别为“chkReadOnly”和“chkHidden”的两个CheckBox控件,用来设置新文件夹的属性;(ID)为“btnNewDir”的Button控件,单击它生成新文件夹。

代码实现
在【设计】中双击“btnNewDir”按钮,为其添加事件处理,代码如下所示:

private void btnNewDir_Click(object sender, System.EventArgs e)

          {

if(NewDirName.Text=="")

                    {

                             Info.Text="请先输入要创建的新文件夹名";

                             return;

                    }

                    string FullDirName = CurrentPath + @"\" + NewDirName.Text;   //生成完整路径

                    try

                    {

                             if(Directory.Exists(FullDirName))

                             {

                                      Info.Text="已存在该文件夹,请更换名称";

                                      return;

                             }

                             DirectoryInfo DirInfo = Directory.CreateDirectory(FullDirName);  //创建目录

                             if (chkReadOnly.Checked==true)

                             {      

                                      if(chkHidden.Checked==false)

                                                DirInfo.Attributes = FileAttributes.ReadOnly;

                                      else

                                                DirInfo.Attributes = FileAttributes.ReadOnly|FileAttributes.Hidden;

                             }

                             else

                             {

                                      if(chkHidden.Checked==true)

                                                DirInfo.Attributes = FileAttributes.Hidden;

                             }

                             LoadDir(CurrentPath);  //重新载入当前目录

                    }

                    catch

                    {

                             Info.Text="创建文件夹失败,请与管理员联系";

                    }

          }

首先要判断的就是用户是否输入了新文件夹名称,如果没有输入的话,则输出错误提示信息“请先输入新文件夹名”,然后退出程序。

如果用户已输入新的文件夹名称,则要判断是否已存在同名文件夹,为此要先得到完整的文件夹路径名“FullDirName”,然后利用Directory.Exists()方法进行判断。若该文件夹还没被创建,则就可以用Directory.CreateDirectory()方法来创建该文件夹。

随后就要对文件夹属性进行设置了,在这里利用了DirectoryInfo类的Attributes属性,文件夹属性包括存档、压缩、目录、隐藏、脱机、只读、系统等等,在这里我们只对只读和隐藏属性进行设置,其它属性设置与之类似。

最后要调用LoadDir()方法重新列出当前目录下的内容,如果文件夹创建成功的话,可以看到新创建的文件夹名。

上传文件到指定文件夹
用户最终是要和文件打交道的,文件夹仅仅是用来方便管理的。文件的上传和下载也就成为“网络硬盘”功能设计中的重要一环。

界面布置
这部分功能涉及到的控件主要有两个:一个是(ID)为“WebFile”的File Field控件,它用来浏览上传文件路径;另一个是(ID)为“btnUpLoad”的上传按钮,单击它完成文件上传。

代码实现
在【设计】中双击“btnUpLoad”按钮,为其添加事件处理,代码如下所示:

private void BtnUpload_Click(object sender, System.EventArgs e)

          {

                    if(WebFile.PostedFile.FileName=="")

                    {

                             Info.Text="请先选择要上传的文件";

                             return;

                    }

                    try

                    {

                             char[] spliter = {'\\'};

                             string [] FileName = WebFile.PostedFile.FileName.Split(spliter,10);

                             string FullPath = CurrentPath + @"\" + FileName[FileName.Length-1];  

//生成完整文件名

                             WebFile.PostedFile.SaveAs(FullPath);  //保存文件

                             LoadDir(CurrentPath);  //重新载入当前目录

                    }

                    catch

                    {

                             Info.Text="上传文件失败,请与管理员联系";

                    }

          }

首先要判断用户是否选择了要上传的文件,这可以通过WebFile.PostedFile.FileName属性来得到,需要说明的是:WebFile是一个“File Field”控件对象,该控件属于HtmlInputFile类,HtmlInputFile.PostedFile方法用来获取对客户端上载文件的访问。

在确定用户选择了要上传的文件后,就要对其上传的路径进行设置了。首先要得到该文件的文件名,由于用户提供的是一个客户端完整路径,需要用Split()方法按“//”分隔符进行分割,结果保存在一个数组里。如:“C://UserDir//Chapter1//Ch1.doc”可以被分割为四部分,其最后一部分(数组最后一项)正是我们需要的文件名称。在上面的程序中,FileName[FileName.Length-1]即为用户上传的文件名。

得到上传路径后就可以进行上传了,这里用到了PostedFile.SaveAs()方法。完成上传后,调用LoadDir()方法就可以显示出刚才上传的文件名。

下载文件到本机或在线查看文件内容
上传和下载是一般来说是一个问题的两个方面,上一节我们提到了文件上传,这一节就要对文件下载进行说明。

界面布置
在目录浏览中,如果选择的是一个文件,点击“打开”按钮就可以进行文件下载了,当然也可以选择直接打开,如下图所示:

图16.5下载和在线打开界面

选择“打开”将直接打开该文件,选择“保存”可以下载该文件。

代码实现
打开文件所点击的还是“打开”按钮,所以要在“打开”事件中加以判断,看选中的是文件夹还是文件。故对btnOpen_Click()事件进行了修改,下面加重部分为新增的代码:

private void BtnOpen_Click(object sender, System.EventArgs e)

          {

                    if(FileList.SelectedItem.Text=="返回上级目录")   //返回上级目录

                    {

                             string ParentPath=Directory.GetParent(CurrentPath).ToString();

                             LoadDir(ParentPath);

                             return;

                    }

                    else if(FileList.SelectedItem.Text.IndexOf(".")>0) //打开文件

                    {

                             FileDownload(FileList.SelectedItem.Text);

                    }

                    else    //打开目录

                    {

                             LoadDir(FileList.SelectedItem.Text);

                    }

          }

如果选择的是文件,则调用FileDownload()方法,其代码部分如下:

private void FileDownload(string FullFileName)

{

FileInfo DownloadFile = new FileInfo(YourFileName); //设置要下载的文件

Response.Clear();                            //清除缓冲区流中的所有内容输出

Response.ClearHeaders();                     //清除缓冲区流中的所有头

Response.Buffer = false;                     //设置缓冲输出为false

//设置输出流的 HTTP MIME 类型为application/octet-stream

Response.ContentType = "application/octet-stream";

//将 HTTP 头添加到输出流

Response.AppendHeader("Content-Disposition",

"attachment;filename=" +

HttpUtility.UrlEncode(DownloadFile.FullName,

System.Text.Encoding.UTF8));

Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());

//将指定的文件直接写入 HTTP 内容输出流。

Response.WriteFile(DownloadFile.FullName);

Response.Flush();       //向客户端发送当前所有缓冲的输出

Response.End();         //将当前所有缓冲的输出发送到客户端

}

这段代码是采用输出流的形式进行文件传输,理解起来比较复杂,如果换一种方式进行处理的话,可以在页面加一个HyperLink控件,选择相应的文件时,使得其链接到相应的路径即可。这里不再多说。

删除文件或文件夹
对于不再需要的文件/文件夹用户有权限做删除处理,这一节我们就来介绍如何实现这一功能。

界面布置
主界面设计中有个“删除“按钮,其(ID)为“btnDelete”,用户在目录浏览中选中要删除的项后,单击该按钮就可以完成删除工作。

代码实现
在【设计】中双击“删除”按钮,为其添加事件处理程序如下:

private void BtnDelete_Click(object sender, System.EventArgs e)

          {

                    DeleteThings(FileList.SelectedItem.Text);

          }

private void DeleteThings(string FullPath)

          {

                    if(FullPath.IndexOf(".")>0) //删除文件

                    {

                             File.Delete(FullPath);

                             LoadDir(CurrentPath);  //重新载入当前目录

                    }

                    else    //删除目录

                    {

                             Directory.Delete(FullPath);

                             LoadDir(CurrentPath); //重新载入当前目录

                    }

          }

删除时首先判断选中的是文件还是文件夹,如果是文件,则调用File.Delete()方法;反则调用Directory.Delete()方法。删除成功后再调用LoadDir()方法显示更改后的目录内容。

小结
这一章中我们先对“网络硬盘”概念进行了介绍,然后对.NET中的File类和Directory类进行了说明,为后面实现“网络硬盘”功能做好了知识储备。随后的各节详细的介绍了如何实现在“网络硬盘”中查看文件夹内容、创建新文件夹、上传下载文件以及删除文件和文件夹。

通过本章的学习,读者对于.NET中文件处理应该说有了很深的认识,相信可以达到举一反三的效果。