在開發Web程序時,不但有存儲在數據庫中和xml文件中的數據形式需要處理,而且還有很多諸如文本、Word文檔和圖片等格式的文件數據需要處理。尤其是在一些信息管理系統中,文檔的處理流程貫穿了整個系統的運行過程。
文件的操作有很多種,如創建文件、復制文件、刪除文件等,這些都是文件最基本的操作,.NET框架提供了一個靜態類File來完成這些操作。
文件的I/O操作是一個比較復雜的過程。在.NET框架下,文件的I/O操作方式都是基于流(Stream)的,由于引進了流的概念,程序員可以通過對一系列的通用對象進行操作,而不必關心該I/O操作是和本機的文件有關還是與網絡中的數據有關,這使得對于文件操作的編程變得非常簡單,這大大減輕了程序員的工作。
.NET框架主要提供了一個System.IO命名空間,該命名空間基本包含了所有和I/O操作相關的類,因此在程序員開發文件操作的程序時需要引用該命名空間。
文件基本操作
在.NET框架里文件的基本操作基本上都是由靜態類File來完成,File類提供了一系列的方法來完成這些操作。File類提供的方法如下:
1.AppendText:創建一個StreamWriter,它將UTF-8編碼文本追加到現有文件。
2.Copy:將現有文件復制到新文件。
3.Create:在指定路徑中創建文件。
4.CreateText:創建或打開一個文件用于寫入UTF-8編碼的文本。
5.Delete:刪除指定的文件。如果指定的文件不存在,則不引發異常。
6.Exists:確定指定的文件是否存在。
7.Move:將指定的文件移到新位置,并提供指定新文件名的選項。
8.Open:打開指定路徑上的FileStream。
9.OpenRead:打開現有文件以進行讀取。
10.OpenText:打開現有UTF-8編碼文本文件以進行讀取。
11.OpenWrite:打開現有文件以進行寫入。
創建文件。
新建項目,添加頁面Default.aspx,在Default.aspx.cs中,在頭文件中引用命名空間:using System.IO;;Page_Load事件中的代碼如下:
1 PRotected void Page_Load(object sender, EventArgs e)2 {3 StreamWriter streamWriter = File.CreateText(Server.MapPath("file1.txt"));4 streamWriter.Write("新創建的文件。");5 streamWriter.Close();6 }
運行項目,在網站根目錄下創建一個file1.txt文件,文件內容為:新創建的文件。
復制文件
Page_Load事件中的代碼如下:
1 protected void Page_Load(object sender, EventArgs e)2 {3 if (File.Exists(Server.MapPath("file1.txt")))4 {5 File.Copy(Server.MapPath("file1.txt"), Server.MapPath("file2.txt"));6 }7 }
刪除文件
Page_Load事件中的代碼如下:
1 protected void Page_Load(object sender, EventArgs e)2 {3 if (File.Exists(Server.MapPath("file2.txt")))4 {5 File.Delete(Server.MapPath("file2.txt"));6 }7 }
文件的IO操作
在.NET框架中,文件的I/O操作是基于流的,而Stream類是所有流的抽象基類。Stream類及其派生類提供這些不同類型的輸入和輸出的一般視圖,使程序員不必了解操作系統和基礎設備的具體細節。
Stream類提供了對I/O操作的基本方法的定義,所有從該類派生出來的類,可以根據實際需要來實現相應的方法。
Stream類提供的方法如下:
1.BeginRead:開始異步讀操作。
2.BeginWrite:開始異步寫操作。
3.Close:關閉當前流并釋放與之相關聯的所有資源。
4.EndRead:等待掛起的異步讀取完成。
5.EndWriter:結束異步寫操作。
6.Flush:當在派生類中重寫時,將清除該流的所有緩沖區,并使得所有緩沖區數據被寫入到基礎設備。
7.Read:當在派生類中重寫時,從當前流讀取字節序列,或者如果已到達流的末尾,則返回-1。
8.Seek:當在派生類中重寫時,設置當前流中的位置。
9.SetLength:當在派生類中重寫時,設置當前流的長度。
10.Writer:當在派生類中重寫時,向當前流中寫入字節序列,并將此流中的當前位置提升寫入的字結數。
11.WriteByte:將一個字節寫入流內的當前位置,并將流內的位置向前推進一個字節。
在.NET里面,由Stream派生出5種主要的流:
1.FileStream:支持對文件的順序和隨機讀寫操作。
2.MemoryStream:支持對內存緩沖區的順序和隨機讀寫操作。
3.NETworkStream:支持對Internet網絡資源的順序和隨機讀寫操作,存在于System.Net.Sockets命名空間。
4.CryptoStream:支持數據的編碼和解碼,存在于 System.Security.Cryptography 名稱空間。
5.BufferedStream:支持緩沖式的讀寫。
程序員可以根據自己的需要選擇相應的流來實現文件的I/O操作。
創建文件。
新建項目,添加頁面Default.aspx,在Default.aspx.cs中,在頭文件中引用命名空間:using System.IO;;Page_Load事件中的代碼如下:
1 protected void Page_Load(object sender, EventArgs e)2 {3 string string1 = "使用流創建的文檔。";4 FileStream fileStream = new FileStream(Server.MapPath("file1.txt"), FileMode.OpenOrCreate);5 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();6 fileStream.Write(encoding.GetBytes(string1), 0, encoding.GetByteCount(string1));7 fileStream.Close();8 }
讀取文件
Page_Load事件中的代碼如下:
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 FileStream fileStream = new FileStream(Server.MapPath("file1.txt"), FileMode.OpenOrCreate); 4 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 5 if (fileStream.Length != 0) 6 { 7 Byte[] byte1 = new byte[fileStream.Length]; 8 fileStream.Read(byte1, 0, Convert.ToInt32(fileStream.Length.ToString())); 9 fileStream.Close();10 Response.Write(encoding.GetString(byte1));11 }12 }
文件上傳
asp.net提供了一個文件上傳控件(FileUpload控件),該控件可以讓用戶更方便地瀏覽和選擇用戶上傳的文件。該控件包含一個瀏覽按鈕和用于輸入文件名的文本框。只要用戶在文本框中輸入了完全限定的文件名,無論是直接輸入還是通過“瀏覽”按鈕選擇,都可以調用該控件的SaveAs方法把文件保存到服務器上。
FileUpload控件提供了如下表所示的屬性:
1.FileBytes:從使用FileUpload控件指定的文件中返回一個字節數組。
2.FileContent:返回一個指向上傳文件的流對象。
3.FileName:返回要上傳文件的名稱,不包含路徑信息。
4.HasFile:指明該控件是否包含文件,返回true表明該控件有文件要上傳。
5.PostedFile:返回已經上傳文件的引用,類型為HttpPostedFile.
HttpPostedFile類的屬性如下:
1.ContentLength:返回上傳文件的按字節表示的文件大小。
2.ContentType:返回上傳文件的MIME內容類型。
3.FileName:返回上傳文件在客戶端的完全限定名。
4.InputStream:返回一個指向上傳文件的流對象。
FileUpload控件提供了一個方法SaveAs,該方法用來把上傳的文件保存到服務器上的指定路徑。
用戶使用FileUpload控件選擇要上傳的文件并提交頁面后,該文件作為請求的一部分上傳。文件將被完整地緩存在服務器內存中,文件完成上傳后,就要在服務器代碼中處理上傳的文件,可以按照以下三種方式來處理內存中的文件:
1.作為在FileUpload控件的FileBytes屬性中公開的字節數組。
2.作為在FileConten屬性中公開的流。
3.作為PostedFile屬性中類型為HttpPostedFile的對象。
在代碼運行時,可以檢查文件的特征,如文件的名稱、大小和MIME類型,然后保存該文件。在保存文件之前檢查文件的特征,可以把存在危害的文件忽略掉,以保證服務器的安全。
文件上傳的處理步驟如下:
1.向頁面添加FileUpload控件。
2.在事件處理程序中,執行操作。
3.檢測FileUpload控件的HasFile屬性。
4.檢查該文件的文件名或MIME類型,以確保用戶上傳了服務器能接收的文件。
5.保存文件。
文件上傳
新建項目,添加頁面Default.aspx,在頁面中添加如下代碼:
1 <div>2 <asp:FileUpload ID="FileUpload1" runat="server" />3 <asp:Button ID="Button1" runat="server" Text="上傳" OnClick="Button1_Click" />4 <br />5 <asp:Label ID="Label1" runat="server" />6 </div>
Default.aspx.cs中的代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Web; 6 using System.Web.UI; 7 using System.Web.UI.WebControls; 8 9 namespace Webapplication210 {11 public partial class WebForm1 : System.Web.UI.Page12 {13 protected void Page_Load(object sender, EventArgs e)14 {15 }16 17 protected void Button1_Click(object sender, EventArgs e)18 {19 Boolean isOk = false;20 string filePath = Server.MapPath("~/UploadedFiles/Images/");21 if (FileUpload1.HasFile)22 {23 string fileExtension = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();24 string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".ico" };25 for (int i = 0; i < allowedExtensions.Length; i++)26 {27 if (fileExtension.ToString () == allowedExtensions[i].ToString())28 {29 isOk = true;30 }31 }32 }33 if (isOk)34 {35 try36 {37 FileUpload1.PostedFile.SaveAs(filePath + FileUpload1.FileName);38 Label1.Text="文件上傳成功。";39 }40 catch (Exception ex)41 {42 Label1.Text="文件上傳失敗。";43 }44 }45 else 46 {47 Label1.Text="不支持的文件類型。";48 }49 }50 }51 }
新聞熱點
疑難解答