Presentation is loading. Please wait.

Presentation is loading. Please wait.

第12章 伺服器的檔案處理 12-1 System.IO類別的基礎 12-2 檔案與資料夾操作 12-3 文字檔案的寫入

Similar presentations


Presentation on theme: "第12章 伺服器的檔案處理 12-1 System.IO類別的基礎 12-2 檔案與資料夾操作 12-3 文字檔案的寫入"— Presentation transcript:

1 第12章 伺服器的檔案處理 12-1 System.IO類別的基礎 12-2 檔案與資料夾操作 12-3 文字檔案的寫入
12-4 文字檔案的讀取 12-5 二進位檔案的處理

2 12-1 System.IO類別的基礎-說明 .NET Framework的檔案與資料夾處理屬於System.IO名稱空間,在ASP.NET.NET程式只需匯入此名稱空間,就可以存取伺服器的檔案系統,或是處理文字或二進位檔案的「串流」(Streams)。

3 12-1 System.IO類別的基礎-類別 System.IO名稱空間關於檔案和資料夾處理的類別,如下表所示:

4 12-2 檔案與資料夾操作 12-2-1 顯示檔案與資料夾清單 12-2-2 建立文字檔案 12-2-3 檢查檔案是否存在
刪除檔案 取得檔案資訊

5 12-2-1 顯示檔案與資料夾清單-顯示資料夾清單1
DirectoryInfo物件的GetDirectories()方法可以取得指定資料夾的清單,如下所示: DirectoryInfo dirInfo = new DirectoryInfo(path); try { DirectoryInfo[] subDirs = dirInfo.GetDirectories(); for (i = 0; i < subDirs.Length; i++) { Response.Write(subDirs[i].Name + "<br/>"); } catch (DirectoryNotFoundException ex) { Response.Write(ex.Message + "<br/>");

6 12-2-1 顯示檔案與資料夾清單-顯示資料夾清單2
然後使用for迴圈顯示資料夾清單,如下所示: for (i = 0; i < subDirs.Length; i++) { Response.Write(subDirs[i].Name + "<br/>"); } 上述程式碼的Length屬性是陣列尺寸,在使用陣列索引取得每一個資料夾的DirectoryInfo物件後,使用Name屬性取得資料夾名稱。

7 顯示目錄及檔案完整範例 protected void Button1_Click(object sender, EventArgs e) {
int i; DirectoryInfo dir = new DirectoryInfo("c:\\"); DirectoryInfo[] subdirs = dir.GetDirectories(); for (i = 0; i < subdirs.Length; i++) Response.Write(subdirs[i].Name + "<br>"); } FileInfo[] subfiles = dir.GetFiles(); foreach (FileInfo subfile in subfiles) Response.Write(subfile.Name + "<br>");

8 建立文字檔案 在ASP.NET程式可以使用System.IO名稱空間的類別,在伺服端建立文字檔案,我們只需建立好FileInfo物件,如下所示: FileInfo fileInfo = new FileInfo(path); 在建立好FileInfo物件後,就可以使用CreateText()方法建立文字檔案,如下所示: fileInfo.CreateText(); 上述程式碼可以將FileInfo物件的檔案路徑建立成文字檔案。

9 檢查檔案是否存在 在進行檔案操作前,通常都需要先檢查檔案是否存在,ASP.NET程式在建立好FileInfo物件後,可以使用Exists屬性來檢查檔案是否存在,如下所示: if (fileInfo.Exists) { ……… } 上述if條件使用Exists屬性檢查檔案是否存在,如果檔案存在傳回true,否則為false。

10 12-2-4 刪除檔案 如果需要刪除伺服器檔案,可以使用FileInfo物件的Delete()方法來刪除檔案,如下所示:
上述程式碼使用FileInfo物件fileInfo的Delete()方法來刪除檔案。

11 12-2-5 取得檔案資訊-說明 FileInfo類別屬性可以取得檔案資訊,首先建立FileInfo檔案物件fInfo,如下所示:
FileInfo fInfo = new FileInfo(path); 上述程式碼的建構子參數是檔案實際路徑,在建立好物件後,就可以使用FileInfo物件屬性取得檔案資訊。

12 取得檔案資訊-屬性

13 12-3 文字檔案的寫入 12-3-1 如何讀取與寫入文字檔案 12-3-2 寫入資料到文字檔案 12-3-3 寫入換行資料到文字檔案
新增文字到文字檔案

14 如何讀取與寫入文字檔案-說明 串流(Stream)觀念最早是使用在Unix作業系統,串流模型如同水管中的水流。當程式開啟檔案來源的輸入串流後,ASP.NET程式就可以從輸入串流依序讀取資料,如下圖所示: 上述圖例的左半邊是讀取資料的輸入串流,如果程式需要輸出資料,在右半邊可以開啟目的檔案的輸出串流,將資料寫入串流。

15 12-3-1 如何讀取與寫入文字檔案- 步驟一:開啟或建立文字檔案1
FileInfo類別的CreateText()方法可以建立全新文字檔案(詳見第12-2-2節),如下所示: StreamWriter sw = fileInfo.CreateText(); 程式碼建立StreamWriter文字串流寫入物件,這是新檔案,或是使用StreamReader或StreamWriter開啟存在的文字檔案,如下所示: StreamReader sr = new StreamReader(path); 程式碼建立StreamReader文字串流讀取物件,可以讀取文字檔案的內容,path建構子參數是文字檔案路徑。

16 12-3-1 如何讀取與寫入文字檔案- 步驟一:開啟或建立文字檔案2
如果是寫入資料,請使用StreamWriter類別,如下所示: StreamWriter sw = new StreamWriter(path); 上述程式碼建立StreamWriter文字串流寫入物件,可以將文字內容寫入檔案。 如果是在檔案最後新增文字內容,請使用FileInfo類別的AppendText()方法來開啟StreamWrite串流,如下所示: StreamWriter sw = fileInfo.AppendText();

17 12-3-1 如何讀取與寫入文字檔案- 步驟二:讀寫文字檔案串流
在建立StreamReader和StreamWriter串流物件後,就可以使用方法來執行文字檔案的讀寫。

18 12-3-1 如何讀取與寫入文字檔案- 步驟三:關閉文字檔案串流
在處理完文字檔案讀寫後,請記得將緩衝區資料寫入和關閉檔案串流,如下所示: sw.Flush(); sw.Close();

19 寫入資料到文字檔案 StreamWriter串流物件可以使用Write()方法,將字串內容寫入文字檔案。Write()方法的參數是寫入字串,但不含換行符號,如下所示: StreamWriter sw = fileInfo.CreateText(); sw.Write("ASP.NET 2.0"); sw.Write("網頁設計範例教本" + "\r\n"); sw.Write("PHP 5網頁設計範例教本" + "\r\n"); sw.Write("JavaScript網頁製作徹底研究"); 上述程式碼寫入字串到StreamWriter串流物件sw,因為Write()方法並不會換行,所以在後面加上"\r\n"逸出字元的字串來新增換行符號。

20 12-3-3 寫入換行資料到文字檔案 StreamWrite串流物件的WriteLine()方法可以寫入含換行的字串,如下所示:
sw.WriteLine("ASP.NET 2.0網頁設計範例教本"); sw.WriteLine("ASP 3.0網頁設計範例教本"); sw.WriteLine("PHP 5網頁設計範例教本"); sw.WriteLine("JavaScript網頁製作徹底研究");

21 新增文字到文字檔案 在第12-3-2節和第12-3-3節寫入檔案前都會清除檔案內容,如同建立全新文字檔案。如果我們準備將資料新增到目前存在檔案的檔尾,如下所示: StreamWriter sw = fileInfo.AppendText(); 上述程式碼使用FileInfo物件的AppendText()方法來開啟文字檔案,如此,當使用Write()或WriteLine()方法寫入資料時,就是新增至檔尾。

22 12-4 文字檔案的讀取 12-4-1 讀取檔案的下一個字元 12-4-2 讀取文字檔的一整行 12-4-3 讀取整個文字檔案(一)
讀取整個文字檔案(二)

23 讀取檔案的下一個字元-1 文字檔案的讀取可以選擇一列一列讀取或一字一字讀取。首先以一字一字為單位來讀取檔案,ASP.NET程式可以使用StreamReader串流物件來開啟唯讀文字檔案,如下所示: StreamReader sr = new StreamReader(path); 上述程式碼的建構子參數path是檔案實際路徑,開啟的是唯讀串流,內含檔案指標指向讀取位置。目前檔案指標是指向檔案開頭,接著讀取字元,如下所示: ch = sr.Read();

24 讀取檔案的下一個字元-2 當再次呼叫Read()方法時,就是從目前檔案指標位置開始,讀取下一個字元。換句話說,讀取多個字元可以使用for迴圈配合Read()方法來讀取,如下所示: for (i = 1; i <= 12; i++) { ch = sr.Read(); Response.Write((char)(ch) + " "); } 上述迴圈呼叫12次Read()方法來讀取12個字元或中文字,並且使用型態轉換將內碼值轉換成字元來顯示。

25 讀取檔案的下一個字元-3 檔案指標移動的圖例,如下圖所示:

26 12-4-2 讀取文字檔的一整行-說明 StreamReader串流物件提供方法可以一行一行讀取文字檔案內容,如下所示:
str = sr.ReadLine(); 上述ReadLine()方法能夠讀取整行文字內容,換行符號為Chr(10) 。

27 讀取文字檔的一整行-圖例 檔案指標一次移動一行,如下圖所示:

28 12-4-3 讀取整個文字檔案(一) StreamReader串流物件提供方法可以讀取整個文字檔案內容,如下所示:
str = sr.ReadToEnd(); 上述ReadToEnd()方法能夠從目前檔案位置讀取到檔尾的全部內容。如果是剛開啟的檔案,就是讀取整個檔案的內容。

29 讀取整個文字檔案(二) ReadToEnd()方法可以讀取整個文字檔案內容,換一個方式,我們可以使用ReadLine()方法配合do/while迴圈來讀取整個文字檔案內容,如下所示: do { textLine = sr.ReadLine(); count += 1; Response.Write(count + ": " + textLine + "<br/>"); } while ( ! (sr.Peek() == -1));

30 範例(本範例開檔會有錯誤, 請於作業中更正)
protected void Page_Load(object sender, EventArgs e) { Button2.Enabled = false; } protected void Button1_Click(object sender, EventArgs e) string path = Server.MapPath(TextBox1.Text); FileInfo file = new FileInfo(path); //檔案是否已存在在此時已確定 if (file.Exists) Response.Write("檔案已存在"); StreamReader sr = new StreamReader(path); TextBox2.Text = sr.ReadToEnd(); sr.Close(); else Button2.Enabled = true; Response.Write("新增檔案"); protected void Button2_Click(object sender, EventArgs e) StreamWriter sw = new StreamWriter(path); sw.Write(TextBox2.Text); sw.Flush(); sw.Close();

31 12-5 二進位檔案的處理-開啟 System.IO名稱空間的類別是將檔案視為串流來處理,不論文字或二進位檔案都可以處理。二進位檔案是使用FileStream串流類別。 以網頁設計來說,二進位檔案處理主要是處理網頁的圖片檔案。在ASP.NET程式可以建立FileStream類別的串流物件來開啟圖片檔案,如下所示: FileStream objStream = new FileStream(path, FileMode.Open); 上述程式碼是使用File類別方法Open()開啟FileStream串流。

32 12-5 二進位檔案的處理-建立緩衝區 在開啟二進位檔案的FileStream串流後,因為內容是二進位資料,所以無法使用字串變數來讀取,我們是使用byte資料型態陣列的緩衝區來讀取,如下所示: byte[] imgBuf = new byte[objStream.Length + 1]; 上述程式碼宣告長度為檔案串流尺寸的緩衝區。

33 12-5 二進位檔案的處理-讀取 接著使用for迴圈配合ReadByte()方法來讀取檔案內容,如下所示:
for (int i = 0; i < objStream.Length; i++) { imgBuf[i] = (byte) objStream.ReadByte(); } 上述for迴圈共執行串流長度的次數,每一次讀取一個byte來存入緩衝區陣列imgBuf[]。

34 輸出二進位檔範例(非使用html) protected void Button3_Click(object sender, EventArgs e) { string path = Server.MapPath("Sunset.jpg"); FileStream pic = new FileStream(path, FileMode.Open); byte[] buf = new byte[pic.Length + 1]; for (int i = 0; i < pic.Length; i++) buf[i] = (byte)pic.ReadByte(); } pic.Close(); Response.BinaryWrite(buf);


Download ppt "第12章 伺服器的檔案處理 12-1 System.IO類別的基礎 12-2 檔案與資料夾操作 12-3 文字檔案的寫入"

Similar presentations


Ads by Google