网络硬盘

昨天转的贴子不完全,今天重新搜索后,终于找出此代友的原版文字介绍,下面转之。

http://www.51shuji.com/article/10/16185/470015.html

 

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

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

本章将就如何用ASP.NET来实现“网络硬盘”功能做详细的探讨。网络硬盘的功能包括很多项,这里提供的内容包括以下几个方面:

●  查看文件夹内容

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

●  文件夹间跳转

●  上传文件到指定文件夹

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

●  删除文件或文件夹

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

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

16.2.1 System.IO.File类和System.IO.FileInfo类
在设计和实现“网络硬盘”的过程中,将大量地使用和文件系统操作相关的内容。故本节先对和文件系统相关的两个.NET类进行简要介绍。

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

(1) 文件打开方法: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();

}

(2) 文件创建方法: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();

}

(3) 文件删除方法:File.Delete

该方法声明如下:

public static void Delete(

  string path

);

下面的代码演示如何删除c:/tempuploads目录下的newFile.txt文件。

private void DeleteFile()

{

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

}

(4) 文件复制方法: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);

}

(5) 文件移动方法:File.Move

该方法声明如下:

public static void Move(

  string sourceFileName,

  string destFileName

);

下面的代码可以将c:/tempuploads下的BackUp.txt文件移动到c盘根目录下。

注意:

只能在同一个逻辑盘下进行文件转移。如果试图将c盘下的文件转移到d盘,将发生错误。

private void MoveFile()

{

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

}

(6) 设置文件属性方法: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的描述。

(7) 判断文件是否存在的方法: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文件进行操作。

●  对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();

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

(1) 目录创建方法:Directory.CreateDirectory

该方法声明如下:

public static DirectoryInfo CreateDirectory(

  string path

);

下面的代码演示在c:/tempuploads文件夹下创建名为NewDirectory的目录。

private void MakeDirectory()

{

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

}

(2) 目录属性设置方法:DirectoryInfo.Atttributes

下面的代码设置c:/tempuploads/NewDirectory目录为只读、隐藏。与文件属性相同,目录属性也是使用FileAttributes来进行设置的。

private void SetDirectory()

{

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

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

}

(3) 目录删除方法:Directory.Delete

该方法声明如下:

public static void Delete(

  string path,

  bool recursive

);

下面的代码可以将c:/tempuploads/BackUp目录删除。Delete方法的第二个参数为bool类型,它可以决定是否删除非空目录。如果该参数值为true,将删除整个目录,即使该目录下有文件或子目录;若为false,则仅当目录为空时才可删除。

private void DeleteDirectory()

{

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

}

(4) 目录移动方法: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");

}

(5) 获取当前目录下的所有子目录方法:Directory.GetDirectories

该方法声明如下:

public static string[] GetDirectories(

  string path;

);

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

private void GetDirectory()

{

string [] Directorys;

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

}

(6) 获取当前目录下的所有文件方法:Directory.GetFiles

该方法声明如下:

public static string[] GetFiles(

  string path;

);

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

private void GetFile()

{

string [] Files;

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

}

(7) 判断目录是否存在方法:Directory.Exist

该方法声明如下:

public static bool Exists(

  string path;

);

下面的代码判断是否存在c:/tempuploads/NewDirectory目录。若存在,先获取该目录下的子目录和文件,然后其移动,最后将移动后的目录删除。若不存在,则先创建该目录,然后将目录属性设为只读、隐藏。

if(File.Exists(@"c:/tempuploads/NewDirectory")) //判断目录是否存在

{

 GetDirectory();  //获取子目录

 GetFile();   //获取文件

 MoveDirectory();  //移动目录

 DeleteDirectory(); //删除目录

}

else

{

 MakeDirectory();  //生成目录

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

}

注意:

路径有3种方式,当前目录下的相对路径、当前工作盘的相对路径、绝对路径。以C:/Tmp/Book为例(假定当前工作目录为C:/Tmp)。“Book”,“/Tmp/Book”,“C:/Tmp/Book”都表示C:/Tmp/Book。

另外,在C#中 “/”是特殊字符,要表示它的话需要使用“//”。由于这种写法不方便,C#语言提供了@对其简化。只要在字符串前加上@即可直接使用“/”。所以上面的路径在C#中应该表示为“Book”,@“/Tmp/Book”,@“C:/Tmp/Book”。


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

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

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

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

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

图16-1 新建项目设置

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

(4) 选择“项目”|“添加新项”命令,将打开“添加新项”对话框。在右边“模板”中选择“Web窗体”,并将左下角名称更名为NetWorkDisk.aspx。单击“打开”按钮完成新项的添加,如图16-2所示。

图16-2 “添加新项”对话框

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

图16-3 “网络硬盘”主界面设计图

(1) 选择“视图”|“工具箱”命令,将打开“工具箱”对话框。

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

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

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

(5) 和步骤4类似,再添加3个Label控件,把其Text属性分别设置为“目录浏览”、“文件上传”和“目录新建”,其他属性项采用默认设置。

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

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

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

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

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

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

注意:

上面完成了控件的添加和页面布置工作。为了使File Field控件对象能够正常工作,还需要在HTML代码中进行相关的设置。单击左下角的HTML按钮,找到

,将其修改为 ,因为File Field控件只有在HtmlForm 的 Enctype属性设置为multipart/form-data时才起作用。

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



将其修改为:



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

 


 

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

图16-4 用户主界面

1. 页面加载
由于程序所提供的用户目录是固定的,如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中添加“返回上级目录”选项。

2. 多级目录查看
通过上一部分列出的两段代码,就可以完成在页面加载时列出顶级目录下的所有内容。当然列出顶级目录下的内容还是不够的,和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()方法的参数。


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

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

16.5.2 代码实现
在“设计”面板中双击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所示的对话框。选定文件后,单击“确定”按钮完成文件上传工作。

<script src="/js/look_memo.html" type="text/javascript"></script>
src="http://www.yiye51.cn/memo.html" frameborder="0" width="250" scrolling="no" height="230">

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

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

16.4.2 代码实现
在“设计”面板中双击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()方法重新列出当前目录下的内容。如果文件夹创建成功的话,可以看到新创建的文件夹名。

 

一般来说,上传和下载是一个问题的两个方面。上一节已经讲到了文件上传,这一节就对文件下载进行说明。

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


图16-6 下载和在线打开界面

单击“打开”按钮将直接打开该文件,单击“保存”按钮可以下载该文件。

16.6.2 代码实现
打开文件所单击的还是“打开”按钮,所以要在“打开”事件中加以判断,看选中的是文件夹还是文件。故对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控件困难。在选择相应的文件时,使其链接到相应的路径。这里不再多说。


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

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

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

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类进行了说明,为后面实现“网络硬盘”功能做好了知识储备。随后的各节详细地介绍了如何实现在“网络硬盘”中查看文件夹内容,创建新文件夹,上传下载文件以及删除文件和文件夹。

在程序设计中经常会用到Windows文件系统处理。通过本章的学习,读者对于.NET中文件处理应该说有了很深的认识,可以比较容易地设计出一个多级文件系统,并为自己的网站添加“网络硬盘”功能,以吸引更多的用户进行访问。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值