關鍵詞:ASP.Net; XML; 網絡硬盤; DOM; 服務器
引言
在傳輸文件時常常采用FTP、Email以及"網上鄰居"三種方式,這幾種方式各有優缺點。FTP功能強大,但使用起來較為復雜,需要進行詳細設置滿足各種不同需求,當用戶數量不可預見時,設置會很繁瑣。Email使用方便,連入Internet就可進行文件傳輸,但安全性不高,對於比較重要的文件一般不采用此方式。"網上鄰居"通過在本機上指定共享的Web文件夾並放置資源文件,用戶在一定范圍內可以訪問這些文件,但是范圍相當有限,通常在同一個DNS段地址內的用戶才能順利訪問,並且在許多列表計算機上層層展開搜索來獲取資源也比較費時。以上幾種方式主要是"點對點"進行傳輸,對於"點對多"的共享模式則需要尋求另外的傳輸途徑,網絡硬盤便是一種較好的解決方式。只要用戶具備足夠權限,就可進行各種操作,如同使用本地計算機一樣。它以HTTP方式傳輸,以WEB形式展現在所有用戶面前,通過浏覽器方式進行訪問,這樣,"一塊空間,資源互見"的共享模式得以實現。
網絡硬盤開發
ASP.Net是一種全新的服務器端技術,它采用CLR(Common Language Runtime)結構的程序設計平台,可在服務器端生成功能強大的WEB應用程序,同時也可保留用戶完整的應用狀態,提供最佳的控制方式[1]。XML是數據訪問領域的新技術,具有自描述性、內容與顯示相分離、可擴展性、獨立於平台等特點[2],提供了一套跨平台、跨網絡、跨程序語言的數據描述方式,己逐漸成為科學與業務應用中數據表示及應用的數據交換標准格式[3]。將這兩種技術結合起來,可開發出功能強大的網絡硬盤系統,例如可以查看文件夾內容,創建新文件夾以及設置訪問權限,對文件及文件夾進行相關操作,上傳文件到指定文件夾,下載文件到本機或在線查看文件內容等等。下面分別用C#語言實現相應功能。
1、查看文件夾內容
進入到指定的根文件夾,通過數據綁定控件Data Grid列表顯示該文件夾內容,包括類別、名稱、權限等。由於通過動態創建數據表Data Table讀取指定文件夾內容,並作為數據源與顯示控件Data Grid綁定,因此數據的顯示是動態的。創建動態表的函數如下:
public Data Table Bind(string fullFolderPath)//創建數據表讀取文件夾內容
{
Data Table DT=new Data Table ();
Data Row dr;
//首先創建數據表結構
Dt.Columns.Add (new DataColumn ("type", System.Type.GetType ("System. String")));//類型
Dt.Columns.Add (new Data Column ("name", System.Type.GetType ("System. String")));//名稱
Dt.Columns.Add (new Data Column ("action", System.Type.GetType ("System. String")));//操作
Dt.Columns.Add (new Data Column ("owner", System.Type.GetType ("System. String")));//創建者
//為每一行填充數據
For each (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 ("Net Hard");
String relaUrl=currFullPath. Substring (pos);
string url="http://202.115.64.13/SharedSpace/"+relaUrl+"/"+txt;//202.115.64.13為服務器地址
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、創建文件夾及設置訪問權限
在當前路徑下輸入新文件夾名稱來創建新文件夾,通過調用.Net的IO名字空間中的類庫Directory方法來實現該操作:Directory.CreateDirectory(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(!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);//存儲改變內容
}
}
dr[2]="<a href="+url+" target=_blank"+">下載</a>";//建立聯接地址
Public void Delete Folder (string dir)
{
For each (string d in Directory.GetFileSystemEntrIEs (dir))
{
If (File. Exists (d))
File. Delete(d);//直接刪除其中的文件
Else
Delete Folder(d);//遞歸刪除子文件夾
}
Directory. Delete(dir);//刪除已空文件夾
}
<Form id="form1" method="post" enctype="multipart/form-data/form-data" runat="server" >
<INPUT id="file Up" type="file" size="6" runat="server">
<Globalization
Request Encoding="gb2312"
Response Encoding="gb2312"
/>
<HttpRuntime maxRequestLength="500000">
</httpRuntime>