1.ASP中常用的标準元件:FileSystemObject,這個元件為 ASP 提供了強大的檔案系統通路能力,可以對伺服器硬碟上的任何有權限的目錄和檔案進行讀寫、删除、改名等操作。FSO對象來自微軟提供的腳本運作庫scrrun.dll中。使用下面的代碼就可以在ASP中建立一個FSO對象:Set fso = CreateObject("Scripting.FileSystemObject")我們使用fso對象包含的屬性和方法,如Drive、Drives、Folder、Floders、File、Files等對伺服器的磁盤、目錄和檔案進行讀、寫、删除等操作。這一強大的檔案系統通路能力給ASP共享空間提供者帶來了嚴重的安全問題,很多ASP空間的管理者都删除此元件或将這個元件改名以避免使用者使用這一标準元件。删除元件或元件改名确實是一個簡單的方法并且也很有效,但是卻使廣大使用者無法使用它的強大的功能。網絡上還有一種看起來很美的方案,它允許使用者使用 FileSystemObject 元件又不影響伺服器的安全,即對每一個使用者都設定一個獨立的伺服器使用者和單個目錄的操作權限。但是這種方法是有問題的。因為ASP和ASP.NET中在這方面的問題十分類似,是以我們将在ASP.NET的相應解決辦法部分詳加說明。在ASP.NET中我們發現這一問題仍然存在,并且變得更加難以解決。這是因為.NET中關于系統IO操作的功能變得更加強大,而使這一問題更嚴重的是ASP.NET所具有的一項新功能,這就元件不需要象ASP那樣必須要使用regsvr32來注冊了,隻需将Dll類庫檔案上傳到bin目錄下就可以直接使用了。這一功能确實給開發ASP.NET帶來了很大的友善,但是卻使我們在ASP中将此dll删除或者改名的解決方法失去效用了,防範此問題就變得更加複雜。在讨論解決方案之前,我們先來看一下怎麼來實作上述的危險的功能
2.檔案系統
我們還要使用System.IO名稱空間的其他幾個類是:
System.IO.Directory:提供用于建立、移動和枚舉通過目錄和子目錄的靜态方法的類
System.IO.File:提供用于建立、複制、删除、移動和打開檔案的靜态方法的類
System.IO.FileInfo:提供建立、複制、删除、移動和打開檔案的執行個體方法的類
System.IO.StreamReader:實作一個 TextReader,使其以一種特定的編碼從位元組流中讀取字元。
每個我們所使用的類的屬性和方法的具體用法我們将以代碼注釋的方式在程式中加以說明。
System.IO名稱空間在 .NET FRAMEWORK提供的mscorlib.dll中,在使用VS.Net程式設計之前需要将此Dll引用到此項目中。
我們所編寫的程式都使用了Codebehind方式,即每一個aspx程式都有一個對應的aspx.cs程式,aspx程式中隻是寫與頁面顯示相關的代碼,所有邏輯實作的代碼都放在相應的aspx.cs檔案中,這樣就可以更好得做到顯示與邏輯的分離。由于我們的目的不是讨論Codebehind技術,是以就不在對此多加讨論了。
在這篇文章裡,我們隻介紹幾個主要的類及其關鍵方法的用法,詳細程式請檢視附帶的源代碼。
程式一:顯示伺服器的目前資訊和全部邏輯驅動器的名稱的程式listdrivers.aspx
主要方法1:我們使用 GetSysInf() 方法來得到伺服器的目前環境和平台的資訊
//擷取系統資訊的方法,此方法在listdrivers.aspx.cs檔案中
public void GetSysInf () {
//擷取作業系統類型
qDrives = Environment.OSVersion.ToString();
//擷取系統檔案夾
qSystemDir = Environment.SystemDirectory.ToString();
qMo = (Environment.WorkingSet/1024).ToString();
//擷取目前目錄(即該程序從中啟動的目錄)的完全限定路徑
qCurDir = Environment.CurrentDirectory.ToString();
//擷取主機的網
絡域名
qDomName = Environment.UserDomainName.ToString();
//擷取系統啟動後經過的毫秒數
qTick = Environment.TickCount;
//計算得到系統啟動後經過的分鐘數
qTick /= 60000;
//擷取機器名
qMachine = Environment.MachineName;
//擷取運作目前程序的使用者名
qUser = Environment.UserName;
achDrives = Directory.GetLogicalDrives();
//擷取此字元串數組的維數,确定有多少個邏輯驅動器
nNumOfDrives = achDrives.Length;
} 系統資訊不需要進行操作,我們簡單的用asp:Label将他們顯示出來就行了。邏輯驅動器的個數在不同的伺服器上是不定的,是以用不定長數組儲存邏輯驅動器的名稱,而且邏輯驅動器的名稱也是我們下一步浏覽目錄和檔案的基礎,故我們采用了資料網格DataGrid來顯示和處理它。顯示和處理邏輯驅動器名稱的DataGrid的代碼(代碼在listdrivers.aspx檔案):
<asp:DataGrid id="DriversGrid" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundColumn HeaderText="ID" DataField="ID" />
<asp:BoundColumn HeaderText="磁盤名" DataField="Drivers" />
<asp:HyperLinkColumn
HeaderText="詳細資訊"
DataNavigateUrlField="Drivers" DataNavigateUrlFormatString="listdir.aspx?dir={0}"
DataTextField="Detail"
Target="_new" />
</Columns>
</asp:DataGrid> 前兩個BoundColumn列都是顯示序号和實際邏輯驅動器名稱的,需要說明的是第三列,我們在進入各個邏輯驅動器顯示目錄和檔案之前需要将所選擇的邏輯驅動器的名稱傳遞到顯示目錄的檔案去,是以需要一個特殊的超級連結行HyperLinkColumn,我們将DataNavigateUrlField設定為資料源中要綁定到 HyperLinkColumn 中的超級連結的 URL 的字段,在此即邏輯驅動器名稱。然後将DataNavigateUrlFormatString設定為當 URL 資料綁定到資料源中的字段時,此HyperLinkColumn中的超級連結的 URL 的顯示格式,即要連結到的下一級處理頁面,在此為listdir.aspx?dir={使用者點選行的邏輯驅動器名稱}
1.ASP中常用的标準元件:FileSystemObject,這個元件為 ASP 提供了強大的檔案系統通路能力,可以對伺服器硬碟上的任何有權限的目錄和檔案進行讀寫、删除、改名等操作。FSO對象來自微軟提供的腳本運作庫scrrun.dll中。使用下面的代碼就可以在ASP中建立一個FSO對象:Set fso = CreateObject("Scripting.FileSystemObject")我們使用fso對象包含的屬性和方法,如Drive、Drives、Folder、Floders、File、Files等對伺服器的磁盤、目錄和檔案進行讀、寫、删除等操作。這一強大的檔案系統通路能力給ASP共享空間提供者帶來了嚴重的安全問題,很多ASP空間的管理者都删除此元件或将這個元件改名以避免使用者使用這一标準元件。删除元件或元件改名确實是一個簡單的方法并且也很有效,但是卻使廣大使用者無法使用它的強大的功能。網絡上還有一種看起來很美的方案,它允許使用者使用 FileSystemObject 元件又不影響伺服器的安全,即對每一個使用者都設定一個獨立的伺服器使用者和單個目錄的操作權限。但是這種方法是有問題的。因為ASP和ASP.NET中在這方面的問題十分類似,是以我們将在ASP.NET的相應解決辦法部分詳加說明。在ASP.NET中我們發現這一問題仍然存在,并且變得更加難以解決。這是因為.NET中關于系統IO操作的功能變得更加強大,而使這一問題更嚴重的是ASP.NET所具有的一項新功能,這就元件不需要象ASP那樣必須要使用regsvr32來注冊了,隻需将Dll類庫檔案上傳到bin目錄下就可以直接使用了。這一功能确實給開發ASP.NET帶來了很大的友善,但是卻使我們在ASP中将此dll删除或者改名的解決方法失去效用了,防範此問題就變得更加複雜。在讨論解決方案之前,我們先來看一下怎麼來實作上述的危險的功能
2.檔案系統
我們還要使用System.IO名稱空間的其他幾個類是:
System.IO.Directory:提供用于建立、移動和枚舉通過目錄和子目錄的靜态方法的類
System.IO.File:提供用于建立、複制、删除、移動和打開檔案的靜态方法的類
System.IO.FileInfo:提供建立、複制、删除、移動和打開檔案的執行個體方法的類
System.IO.StreamReader:實作一個 TextReader,使其以一種特定的編碼從位元組流中讀取字元。
每個我們所使用的類的屬性和方法的具體用法我們将以代碼注釋的方式在程式中加以說明。
System.IO名稱空間在 .NET FRAMEWORK提供的mscorlib.dll中,在使用VS.Net程式設計之前需要将此Dll引用到此項目中。
我們所編寫的程式都使用了Codebehind方式,即每一個aspx程式都有一個對應的aspx.cs程式,aspx程式中隻是寫與頁面顯示相關的代碼,所有邏輯實作的代碼都放在相應的aspx.cs檔案中,這樣就可以更好得做到顯示與邏輯的分離。由于我們的目的不是讨論Codebehind技術,是以就不在對此多加讨論了。
在這篇文章裡,我們隻介紹幾個主要的類及其關鍵方法的用法,詳細程式請檢視附帶的源代碼。
程式一:顯示伺服器的目前資訊和全部邏輯驅動器的名稱的程式listdrivers.aspx
主要方法1:我們使用 GetSysInf() 方法來得到伺服器的目前環境和平台的資訊
//擷取系統資訊的方法,此方法在listdrivers.aspx.cs檔案中
public void GetSysInf () {
//擷取作業系統類型
qDrives = Environment.OSVersion.ToString();
//擷取系統檔案夾
qSystemDir = Environment.SystemDirectory.ToString();
qMo = (Environment.WorkingSet/1024).ToString();
//擷取目前目錄(即該程序從中啟動的目錄)的完全限定路徑
qCurDir = Environment.CurrentDirectory.ToString();
//擷取主機的網
tail"
HeaderText="詳細資訊"
Target="_new"
/>
在兩個DataGrid(DirGrid,FileGrid)中我們分别設定了兩個HyperLinkColumn列來導航到不同的處理頁面。
在兩個DataGrid中我們都使用了一個删除的按鈕列:
<asp:ButtonColumn HeaderText="删除"
Text="删除"
CommandName="Delete"
/>
由于添加、更新、删除功能列都是DataGrid的預設模闆列,是以可以在Vs.net中通過DataGrid的屬性生成器自動添加此列。
擷取上一頁面所傳遞來的參數的代碼:
因為在下面産生資料源的方法中需要使用由上一個頁面傳遞過來的參數來确定目錄和檔案的名稱,是以在頁面的Page_Load方法裡使用了下列代碼:
strDir2List = Request.QueryString["dir"];
字元串strDir2List即傳過來的目錄名或檔案名。
因為我們使用了兩個DateGrid,就需要進行兩次資料綁定,就有兩個不同的生成資料源的方法。
生成目錄資料網格(DirGrid)資料源的方法:
//通過此方法傳回一個集合形式的資料視圖DataView,用來初始化子目錄的DataGrid
ICollection CreateDataSourceDir() {
dtDir = new DataTable();
DataRow dr;
//向DataTable中添加新的資料列,共四列
dtDir.Columns.Add(new DataColumn("DirID", typeof(Int32)));
dtDir.Columns.Add(new DataColumn("DirName", typeof(string)));
dtDir.Columns.Add(new DataColumn("DelDir", typeof(string)));
dtDir.Columns.Add(new DataColumn("DirDetail", typeof(string)));
//根據傳入的參數(目錄名)得到此目錄下所有子目錄名的字元串數組
string [] DirEntries = Directory.GetDirectories(strDir2List);
//使用foreach循環可以對未知長度的數組進行周遊循環
foreach(string DirName in DirEntries){
dr = dtDir.NewRow();
dr[0] = i;//序号
dr[1] = DirName;//檔案夾名稱
dr[3] = "删除";
dr[3] = "檢視詳情";
dtDir.Rows.Add(dr);
i++;
}
DataView dvDir = new DataView(dtDir);
//傳回得到的資料視圖
return dvDir;
}
生成檔案資料網格(FileGrid)資料源的方法:
//通過此方法傳回一個集合形式的資料視圖DataView,用來初始化檔案的DataGrid
ICollection CreateDataSourceFile() {
dtFile = new DataTable();
DataRow dr;
dtFile.Columns.Add(new DataColumn("FileID", typeof(Int32)));
dtFile.Columns.Add(new DataColumn("FileName", typeof(string)));
dtFile.Columns.Add(new DataColumn("DelFile", typeof(string)));
dtFile.Columns.Add(new DataColumn("FileDetail", typeof(string)));
//根據傳入的參數(目錄名)得到此目錄下所有檔案名的字元串數組
string [] FileEntries = Directory.GetFiles(strDir2List);
foreach(string FileName in FileEntries){
dr = dtFile.NewRow();
dr[0] = i;
dr[1] = FileName;
dr[2] = "删除";
dr[3] = "檢視詳情";
dtFile.Rows.Add(dr);
i++;
}
dvFile = new DataView(dtFile);
return dvFile;
}
我們程式設計實作了兩個DataSource隻需在頁面的Page_Load方法裡對兩個DataGrid進行資料綁定即可将得到的DataTable中的資料顯示在aspx頁面的DataGrid上。
資料綁定代碼://對子目錄資料清單DirGrid進行資料源定義和資料綁定
DirGrid.DataSource = CreateDataSourceDir();
DirGrid.DataBind();
//對檔案資料清單FileGrid進行資料源定義和資料綁定
FileGrid.DataSource = CreateDataSourceFile();
FileGrid.DataBind();
通過我們上邊介紹的主要方法,我們實作了對某個邏輯驅動器或目錄中的所有子目錄和檔案進行了清單顯示,并且可以根據顯示結果更進一步的浏覽子目錄或者檢視檔案的屬性和内容提要。浏覽子目錄仍然是通過listdir.aspx這個程式,沒有任何子目錄級别要求,沒有目錄深度限制。
删除子目錄和檔案的主要方法和代碼:
在删除子目錄時,我們需要用到Directory.Delete (string,bool)方法,此方法有兩種:
1.public static void Delete(string);
從指定路徑删除空目錄。
2.public static void Delete(string, boolean);
删除指定的目錄并(如果訓示)删除該目錄中的任何子目錄,将boolean設定為true的話,則删除此目錄下的所有子目錄和檔案,否則将boolean設定為false。
在這裡我們使用了第二種方法,如果選擇删除的話,将删除此目錄下的所有子目錄和檔案。
注意:Directory 類的所有方法都是靜态的,因而無需具有目錄Directory的執行個體就可被調用。
private void DirGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e){
TableCell ItemCell = e.Item.Cells[1];
//得到此子目錄的名稱的字元串
string item = ItemCell.Text;
//删除此子目錄
Directory.Delete(item,true);
//删除後進行資料綁定以更新資料清單
DirGrid.DataBind();
}
在删除檔案時,我們需要用到File.Delete(string path);
注意:File 類的所有方法都是靜态的,因而無需具有目錄的執行個體就可被調用。
private void FileGrid_DeleteCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e) {
TableCell ItemCell = e.Item.Cells[1];
//得到此檔案名稱的字元串
string item = ItemCell.Text;
//删除此檔案
File.Delete(item);
//删除後進行資料綁定以更新資料清單
DirGrid.DataBind();
}
通過上邊的主要方法我們在頁面上實作了一個删除某一個子目錄或者檔案的功能,此功能在測試時需要慎重使用,一旦删除無法通過正常方法恢複。其他如目錄或檔案改名、修改内容等方法都可以在此程式基礎上添加相應的功能,實作方法也很簡單。各位愛好者可以通過添加相應功能,使之擴充為一個基于Web的伺服器檔案管理系統。我們也可以由此看到這個程式的危害性,一個沒有對此安全隐患采取防範措施的伺服器的檔案系統就都暴露在了使用此程式的使用者面前。