引言
在传输文件时常常采用FTPEmail以及网上邻居三种方式这几种方式各有优缺点FTP功能强大但使用起来较为复杂需要进行详细设置满足各种不同需求当用户数量不可预见时设置会很繁琐Email使用方便连入Internet就可进行文件传输但安全性不高对于比较重要的文件一般不采用此方式网上邻居通过在本机上指定共享的Web文件夹并放置资源文件用户在一定范围内可以访问这些文件但是范围相当有限通常在同一个DNS段地址内的用户才能顺利访问并且在许多列表计算机上层层展开搜索来获取资源也比较费时以上几种方式主要是点对点进行传输对于点对多的共享模式则需要寻求另外的传输途径网络硬盘便是一种较好的解决方式只要用户具备足够权限就可进行各种操作如同使用本地计算机一样它以HTTP方式传输以WEB形式展现在所有用户面前通过浏览器方式进行访问这样一块空间资源互见的共享模式得以实现
网络硬盘开发
ASPNET是一种全新的服务器端技术它采用CLR(Common Language Runtime)结构的程序设计平台可在服务器端生成功能强大的WEB应用程序同时也可保留用户完整的应用状态提供最佳的控制方式[]XML是数据访问领域的新技术具有自描述性内容与显示相分离可扩展性独立于平台等特点[]提供了一套跨平台跨网络跨程序语言的数据描述方式己逐渐成为科学与业务应用中数据表示及应用的数据交换标准格式[]将这两种技术结合起来可开发出功能强大的网络硬盘系统例如可以查看文件夹内容创建新文件夹以及设置访问权限对文件及文件夹进行相关操作上传文件到指定文件夹下载文件到本机或在线查看文件内容等等下面分别用C#语言实现相应功能
查看文件夹内容
进入到指定的根文件夹通过数据绑定控件Data Grid列表显示该文件夹内容包括类别名称权限等由于通过动态创建数据表Data Table读取指定文件夹内容并作为数据源与显示控件Data Grid绑定因此数据的显示是动态的创建动态表的函数如下
public Data Table Bind(string fullFolderPath)//创建数据表读取文件夹内容
{
Data Table DT=new Data Table ();
Data Row dr;
//首先创建数据表结构
DtColumnsAdd (new DataColumn (type SystemTypeGetType (System String)));//类型
DtColumnsAdd (new Data Column (name SystemTypeGetType (System String)));//名称
DtColumnsAdd (new Data Column (action SystemTypeGetType (System String)));//操作
DtColumnsAdd (new Data Column (owner SystemTypeGetType (System String)));//创建者
//为每一行填充数据
For each (string d in DirectoryGetFileSystemEntries (fullFolderPath)){
dr=dtNewRow();//新建行
String [] parts=d Split (new char []{\\});
String txt=parts [parts Length];
dr[]=txt;//名称name
if(FileExists(d))//如果是文件
{
dr[]=文件;//类型type
Int pos=currFullPath IndexOf (Net Hard);
String relaUrl=currFullPath Substring (pos);
string url=+relaUrl+/+txt;//为服务器地址
dr[]=<a +url+ target=_blank+>下载</a>;
}
Else if (Directory Exists(d)){//如果是文件夹
dr[]=文件夹;//type类型
string password=GetFolderPassword(d);//取得文件夹密码信息
Int type=GetFolderLimitType (d);
If ((password! =no)&&(type! =))
Dr []=<a +d+>密封</a>;//操作action
Else
Dr []=<a +d+>进入</a>;//操作action
dr[]=GetFolderOwner(d);//取文件夹创建者名
}
Else
ResponseWrite(<script>alert(无对象可绑定!)</script>);
dtRowsAdd(dr);//添加行
return dt;//返回数据表
}
}
此方法取出指定文件夹下的内容分别处理如果是文件则显示下载链接指向服务器文件的Url地址对于文件夹若是进入受限则显示密封导入到密码验证页否则显示进入链接到初始页
创建文件夹及设置访问权限
在当前路径下输入新文件夹名称来创建新文件夹通过调用NET的IO名字空间中的类库Directory方法来实现该操作DirectoryCreateDirectory(string directory)字符串directory表示新建文件夹的完整路径该方法默认向所有用户开放新文件夹的完全读写访问权限对于网络硬盘共享根文件夹可手动进行创建并设置写入权限通过执行internet信息服务的权限向导来设置访问权限可以设置密码来指定是否允许用户进入该文件夹以及是否允许用户删除该文件夹此外为了管理这些文件夹需要保留相关设置信息如文件夹名位置受限操作类型密码及创建者等将这些信息写入XML文件随后通过读写该XML文件来实现对文件夹的相关操作
Public void CreateXmlOrAddFrag (string xmlFullPath string folderFullPath string owner string password int type){
XmlDocument xmlDoc=new XmlDocument();
string xml=;
String xmlNode=<character>;
XmlNode+=<full Path>;
XmlNode+=folderFullPath;
XmlNode+=</full Path>;
XmlNode+=<owner>;
XmlNode+=owner;
XmlNode+=</owner>;
xmlNode+=<password>;
xmlNode+=password;
xmlNode+=</password>;
xmlNode+=<type>;
xmlNode+=type;
xmlNode+=</type>;
xmlNode+=</character>;
if(!FileExists(xmlFullPath)){//若不存在则创建xml存储文件
xml=<?xml version= encoding=gb?>;
xml+=<folder>;
xml+=xmlNode;
xml+=</folder>;
xmlDocLoadXml(xml);
xmlDocSave(xmlFullPath);//存储文件
}
else{//存在xml存储文件则添加新的文档片段
xmlDocLoad(xmlFullPath);
XmlDocumentFragment docFrag=xmlDocCreateDocumentFragment();//文档片元素节点
docFragInnerXml=xmlNode;
XmlNode currNode=xmlDocDocumentElement;//获取文档根节点
currNodeInsertBefore(docFragcurrNodeFirstChild);//插入文档片段
xmlDocSave(xmlFullPath);//存储改变内容
}
}
其中参数fileFullPath是存储文件夹信息的XML文件路径folderFullPath是此新文件夹路径owner是创建者名password是密码type表示限制操作的类型(表示进入受限表示删除受限)程序首先判断存储文件夹信息的文件是否存在不存在则动态创建文件之后新建文件夹时只需添加文档片段即可这里对XML文件的读写通过文档对象模型DOM实现由于此处XML文件不会很大因此对内存资源要求不会太高速度会很快
对文件及文件夹的操作
对文件的操作包括下载和删除两种用下面的语句实现下载功能
dr[]=<a +url+ target=_blank+>下载</a>;//建立联接地址
其中url是指定文件对应的服务器路径 通过这样的链接将文件定位到服务器上的对应位置客户端可以下载文件到本机上也可在服务器上打开它
删除文件则利用NET的IO命名空间的File类库中的方法实现File Delete(string filename)其中filename为文件的完整路径
如果文件夹在创建时被设置为进入受限或者删除受限用户在执行这样的操作时将被要求密码验证只有通过验证才能完成相应的操作 NET的Directory类库提供的方法Delete()只能删除空文件夹因此需要先清空文件夹中的内容然后才能完成此操作由于文件夹中可能还包含有文件夹这里通过递归调用实现该操作
Public void Delete Folder (string dir)
{
For each (string d in DirectoryGetFileSystemEntries (dir))
{
If (File Exists (d))
File Delete(d);//直接删除其中的文件
Else
Delete Folder(d);//递归删除子文件夹
}
Directory Delete(dir);//删除已空文件夹
}
其中参数dir是待删除文件夹的完整路径程序使用循环语句查找文件夹中的内容若是文件则直接删除若是文件夹则递归调用方法自身来删除子文件夹文件夹清空后再完成删除操作
文件上传
NET提供的类库HttpPostedFile和HttpFilesCollection可以访问上传到服务器的文件并且可以控制文件上传过程HttpPostedFile类封装已上传到服务器的文件对象其方法和属性提供对每个文件内容和属性的访问HttpFilesCollection类为多个HttpPostedFile对象提供一个容器保存上传给服务器的数据结构的类利用被传送的文件集合的Files属性从HttpRequest对象加以访问
)客户端表单的编码类型Enctype 设置为multipart/formdata的MIME格式提交表单使用HTTP的post方法
<Form id=form method=post enctype=multipart/formdata