通過我們上邊介紹的主要方法,我們實現了對某個邏輯磁碟機或目錄中的所有子目錄和檔案進行了列表顯示,並且可以根據顯示結果更進一步的瀏覽子目錄或者查看檔案的屬性和內容提要。瀏覽子目錄仍然是通過listdir.aspx這個程式,沒有任何子目錄層級要求,沒有目錄深度限制。
說明:本文中所有程式均在Windows 2000 Server中文版 + SP2上編譯運行無誤
開發環境:.Net 架構1.0 Version 1.0.3705
在我們編寫代碼之前,有必要瞭解一下我們需要用到的幾個主要的類。這幾個類都在System.IO名稱空間下,System.IO 名稱空間包含允許在資料流和檔案上進行同步和非同步讀寫的類。
在整個應用程式的開始部分我們需要瞭解一下伺服器的系統資訊,這就需要用到System.Environment類,該類提供有關當前環境和平台的資訊以及操作它們的方法。我們通過System.Environment類可以得到系統的目前的目錄和系統目錄,這可以使我們更快的發現幾個關鍵的目錄;我們還可以通過擷取運行當前進程的使用者名稱來協助我們瞭解ASP.NET程式運行所使用的使用者,進一步設定使用者權限以避免這一安全問題。
我們還要使用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();
/*擷取映射到進程內容相關的實體記憶體量,通過這一記憶體映射量可以瞭解ASP.NET程式在運行時需要多少系統實體記憶體,有助於更好的規劃我們的整個應用,因為實體記憶體量是以Byte為單位的,所以我們將此數值除以1024,可以得到單位為KB的實體記憶體量*/
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={使用者點擊行的邏輯磁碟機名稱}
建立資料來源的代碼(代碼在listdrivers.aspx.cs檔案中):
//通過此方法返回一個集合形式的資料檢視DataView
ICollection CreateDataSource() {
//定義記憶體中的資料表DataTable
DataTable dt = new DataTable();
//定義DataTable中的一行資料DataRow
DataRow dr;
/*向DataTable中增加一個列,格式:DataColumn("Column", type)
Column為資料列的名字,type為資料列的資料類型*/
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("drivers", typeof(string)));
dt.Columns.Add(new DataColumn("detail", typeof(string)));
//使用for迴圈將邏輯磁碟機的名稱以行的形式添加到資料表DataTable中
for (int i = 0; i < nNumOfDrives; i++) {
//定義新行
dr = dt.NewRow();
//對行中每列進行賦值,注意要與上邊定義的DataTable的行相對應
dr[0] = i; //迴圈產生的序號
dr[1] = achDrives[i].ToString(); //邏輯磁碟機的名稱
dr[2] = "查看詳情";
//向DataTable中添加行
dt.Rows.Add(dr);
}
//根據得到的DataTable產生自訂視圖DataView
DataView dv = new DataView(dt);
//返回得到的視圖DataView
return dv;
}
我們通過這個方法得到了一個包含所有我們需要的資料的資料檢視DataView,我們只需要在此aspx頁的Page_Load方法中將此資料檢視綁定到DataGrid上就可以了。
資料繫結代碼(代碼在listdrivers.aspx.cs檔案中):
/* 設定DataGrid的資料來源DataSource為我們從CreateDataSource()方法得到的資料檢視DataView */
DriversGrid.DataSource = CreateDataSource();
//將此DataGrid進行資料繫結
DriversGrid.DataBind();
通過上邊介紹的幾種主要方法我們就實現了擷取系統資訊和顯示所有邏輯磁碟機名稱的功能,並且可以通過相應的連結進入下一個顯示目錄和檔案名稱的程式listdir.aspx顯示該邏輯磁碟機下的所有目錄和檔案。
程式二:顯示目錄中所有子目錄和檔案的程式listdir.aspx
目錄下有子目錄和檔案兩種形式,必須分別對待。我們調用此程式本身對子目錄進行列表顯示,而檔案我們需要調用showfile.aspx程式對檔案的屬性和內容進行顯示。並且兩者還有不同的刪除方法,所以我們在這裡設定了兩個DataGrid,兩個DataTable,兩個DataView,分別處理和顯示目錄和檔案。
顯示和處理目錄和檔案的DataGrid的代碼(代碼在listdir.aspx檔案):
顯示目錄或檔案的序號和名稱的資料列類似於listdrivers.aspx程式中的相應代碼,這裡就不再重複了。對於子目錄和檔案分別有各自的處理頁面,所以需要導航到兩個不同的頁面,對於子目錄,我們繼續使用listdir.aspx程式對其下的子目錄和檔案進行列表顯示:
<asp:HyperLinkColumn DataNavigateUrlField="DirName"
DataNavigateUrlFormatString="listdir.aspx?dir={0}"
DataTextField="DirDetail"
HeaderText="詳細資料"
Target="_new"
/>
對於檔案,我們使用showfile.aspx程式顯示其屬性和內容:
<asp:HyperLinkColumn DataNavigateUrlField="FileName"
DataNavigateUrlFormatString="showfile.aspx?file={0}"
DataTextField="FileDetail"
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這個程式,沒有任何子目錄層級要求,沒有目錄深度限制。