文件传送常用的三种方式:FTP、Email及“网上邻居”都在一定程度上实现了文件数据的交流
作者:shinely 来源:论坛 2007年11月8日
关键字: Windows
开发细节及技术关键点
1、查看文件夹内容:
程序一开始将进入指定的根文件夹(如\NetHard),这个文件夹下的内容将通过数据绑定控件(DataGrid)来列表显示,包括以下方面:类别(区别文件夹或文件)、名称、权限(是否允许进入文件夹?是否可以下载文件?)、删除(是否允许删除文件或文件夹?)以及针对文件夹的创建者。这里,由于文件夹中内容动态变化(你不知道什么时候就有用户传送了文件或新建了文件夹或删除了它们),我们通过动态创建数据表DataTable来读取指定文件夹下的内容, 然后作为数据源与显示控件DataGrid绑定,这样,数据的显示就总是适时的。创建动态表的函数如下:
public DataTable Bind(string fullFolderPath)//创建数据表读取文件夹内容
{
//以下是动态创建数据表的方法
DataTable dt=new DataTable();
DataRow dr;
//首先创建数据表结构
dt.Columns.Add(new DataColumn("type",System.Type.GetType("System.String")));//类型
dt.Columns.Add(new DataColumn("name",System.Type.GetType("System.String")));//名称
dt.Columns.Add(new DataColumn("action",System.Type.GetType("System.String")));//操作
dt.Columns.Add(new DataColumn("owner",System.Type.GetType("System.String")));//创建人
//为每一行填充数据
foreach(string d in Directory.GetFileSystemEntries(fullFolderPath)){
dr=dt.NewRow();//建新行
string[] parts=d.Split(new char[]{'\\'});
string txt=parts[parts.Length-1];//取最后一部分的字符串,它将可能是文件名或文件夹
dr[1]=txt;//名称name
if(File.Exists(d))//如果是文件
{
dr[0]="文件";//类型type
int pos=currFullPath.IndexOf("NetHard");
string relaUrl=currFullPath.Substring(pos);
string
url="http://10.80.50.1/SharedSpace/"+relaUrl+"/"+txt;//
10.80.50.1为作者服务器地址,你应该将它修改为你所在服务器地址
dr[2]="<a href="+url+" target=_blank"+">下载</a>";
}
else if(Directory.Exists(d)){//如果是文件夹
dr[0]="文件夹";//type类型
string password=GetFolderPassword(d);//取得文件夹密码信息
int type=GetFolderLimitType(d);
if((password!="no")&&(type!=1))
dr[2]="<a
href=PasswordValidate.aspx?path="+d+">密封</a>";//操作action
else
dr[2]="<a href=Default.aspx?path="+d+">进入</a>";//操作action
dr[3]=GetFolderOwner(d);//取文件夹创建者名
}
else
Response.Write("<script>alert('无对象可绑定!')</script>");
dt.Rows.Add(dr);//添加行
return dt;//返回数据表
}
}
这个方法取出指定文件夹下的内容分别处理:如果是文件,就显示"下载"链接指向服务器上文件的Url地址;对文件夹需要视保护与否及保护类型进一步区别处理:若"进入受限"则显示"密封"导入到密码验证页,"进入不受限"时修改查询字符串,显示"进入"链接指向初始显示页。
2、创建新文件夹及设置访问权限:
输入新文件夹名后,你就可以在当前路径下创建新的文件夹,Asp.net下远程创建新文件夹和在本地机操作完全一样,非常的简单,.Net的IO名字空间提供了专门的类库Directory,通过调用其方法就可以实现,语句如下:
Directory.CreateDirectory(string directory)
其中,字符串directory表示新建文件夹的完整路径,这个方法默认向所有用户开放新文件夹的完全读写访问权限。特殊地,对网络硬盘共享根文件夹(程序中示例为"NetHard"文件夹,你可以更改它)的创建你还可以手动进行,对应地,你需要手动设置以开放此文件夹的写入权限,在IIS下,你可以在"internet信息服务"下,对该文件夹执行"权限向导"来设置访问权限。
资源共享时应该考虑安全性。这里,你可以设置用户对该文件夹的访问权限,通过设置密码,你可以指定是否允许用户进入该文件夹,是否允许删除该文件夹,或者两者都禁止。这样,你可以保护自己的文件,将它们独占访问或者限制在一个特定的范围内(这个范围的成员应该知道你的密码),这样,产品研发部门可以共用一个文件夹,财务部门也通过同样的方式共用另一个文件夹,不属于这个部门的人员将限制访问。当然,这样的限制你也可以应用到单个文件上(这样的应用似乎不多,程序未实现)。
此外,为了管理这些文件夹,你需要保留它们的设置信息:文件夹名、位置、受限操作类型、密码及创建人等。程序中将这些信息写入一Xml文件(此为folder.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+="<fullPath>";
xmlNode+=folderFullPath;
xmlNode+="</fullPath>";
xmlNode+="<owner>";
xmlNode+=owner;
xmlNode+="</owner>";
xmlNode+="<password>";
xmlNode+=password;
xmlNode+="</password>";
xmlNode+="<type>";
xmlNode+=type;
xmlNode+="</type>";
xmlNode+="</character>";
if(!File.Exists(xmlFullPath)){//不存在则创建xml存储文件
xml="<?xml version='1.0' encoding='gb2312'?>";
xml+="<folder>";
xml+=xmlNode;
xml+="</folder>";
xmlDoc.LoadXml(xml);
xmlDoc.Save(xmlFullPath);//存储文件
}
else{//存在xml存储文件则添加新的文档片段
xmlDoc.Load(xmlFullPath);
XmlDocumentFragment
docFrag=xmlDoc.CreateDocumentFragment();//文档片元素节点
docFrag.InnerXml=xmlNode;
XmlNode currNode=xmlDoc.DocumentElement;//获取文档根节淀
currNode.InsertBefore(docFrag,currNode.FirstChild);//插入文档段
xmlDoc.Save(xmlFullPath);//存储改变
}
}
其中,参数fileFullPath是存储文件夹信息的xml文件路径,folderFullPath是此新文件夹路径,owner是创建人名,password是密码,type表示限制操作的类型("0"表示进入受限,"1"表示删除受限)。在程序运行之初,存储文件夹信息的folder.xml文件可能尚不存在,所以程序中首先判断这个文件是否存在,不存在则动态创建这个文件,这之后新建文件夹时,将只需要添加文档片段。这里,对Xml文件的读写通过DOM(文档对象模型)来实现,由于此处Xml文件不会太大,这种方式不会对内存资源要求太高,速度也会很快!