熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

基於ASP.NET與XML的網絡硬盤開發

2013-11-13 10:20:44  來源: .NET編程 

  引言
  
  在傳輸文件時常常采用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
From:http://tw.wingwit.com/Article/program/net/201311/13314.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.