明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

在ASP.NET頁中讀取文本文件

[摘要]簡介 在現(xiàn)實世界中,人們經(jīng)常希望能夠把某個文本文件的部分或全部內(nèi)容保存到一個 Web 網(wǎng)頁變量中。在經(jīng)典的 ASP 中,只要簡單地使用 FileSystemObject 就能做到了。其實,在 ASP...
簡介
在現(xiàn)實世界中,人們經(jīng)常希望能夠把某個文本文件的部分或全部內(nèi)容保存到一個 Web 網(wǎng)頁變量中。在經(jīng)典的 ASP 中,只要簡單地使用 FileSystemObject 就能做到了。其實,在 ASPFAQs.com 中就有一個 FAQ 欄目專門討論 FileSystemObject 。
可是在 ASP.NET 中呢?FileSystemObject 當(dāng)然還可以用,不過,經(jīng)驗表明這么做會嚴重影響服務(wù)器性能。因此,最好還是使用 .NET 框架本身提供的類來讀取文件。本文要介紹的是如何讀取文本文件;今后我還會介紹如何使用 .NET 框架類來讀取 XML 文件。

File ? FileInfo ?

在 .NET 框架中,有許多方法可以打開文本文件。有趣的是,所有這么方法集中在 System.IO 名字空間的兩個類中。它們是 File 類和 FileInfo 類。兩個類之間的區(qū)別很小。File 類的方法全都是共享方法(靜態(tài)方法),而FileInfo 類有例外。共享方法就是不用創(chuàng)建類實例也能調(diào)用的方法。假設(shè)要用這兩個類刪除文件,則可以這么做:

'使用 File 類
File.Delete(fileName)

'使用 FileInfo 類
Dim fInfo as FileInfo
fInfo = new FileInfo(fileName)
fInfo.Delete()

請注意,F(xiàn)ile 類的 Delete 方法只帶一個參數(shù),即待刪的文件,而且不必對 File 類進行實例化就能調(diào)用。再來看 FileInfo 類,它的 Delete 方法不帶參數(shù),因為文件名在 FileInfo 類實例的構(gòu)造器中指定。

就我個人而言,我偏愛 File ,因此就拿它來作示范吧。我敢打賭 File 類的效率稍微高那么一點點,因為使用它就不會因為類的實例化而煩惱;不過那只是猜測而已。(如果感興趣,請不妨編程比較一下它們的性能。當(dāng)你完成之后,請把結(jié)果告訴我!)

打開文件

打開文本文件最簡單的途徑是調(diào)用 OpenText 方法,它將按照 UTF-8 (ASCII) 格式打開文本文件。你還可以選擇通用的 Open 方法,以便指定文件操作模式 (create/open/append/truncate) 、操作權(quán)限 (read/write/read-write) 和文件共享權(quán)限了;可既然你只需要讀取文本文件,那么相對簡單的 OpenText 方法也就足以應(yīng)付了。
OpenText 方法返回一個 StreamReader 對象,只要訪問該對象就能從剛才打開的文件中讀取文本內(nèi)容。因此,打開文件所用的 ASP.NET 代碼大致如下:

<%@ Import Namespace="System.IO" %>
<script language="vb" runat="server">
sub Page_Load(sender as Object, e as EventArgs)
'以“只讀”方式打開文件
Dim FILENAME as String = Server.MapPath("Rand.txt")

'創(chuàng)建 StreamReader 類實例,準備讀取文件內(nèi)容
Dim objStreamReader as StreamReader
objStreamReader = File.OpenText(FILENAME)
...

請注意,代碼的第一行導(dǎo)入了 System.IO 命名空間。這是因為 File 類就屬于此命名空間。還有,在 Page_Load 事件處理程序中,創(chuàng)建了一個字符串 FILENAME ,其內(nèi)容就是欲打開的文件的物理路徑(比如 C:\Inetpub\wwwroot\Rand.txt)。最后,在 ASP.NET 中的 Server.MapPath 也和經(jīng)典的 ASP 中相同 (為了更好地理解 Server.MapPath ,請別忘了閱讀位于 http://aspnet.4guysfromrolla.com/webtech/121799-1.shtml 的《Using Server.MapPath》)。

從文件中讀取文本

現(xiàn)在,你面臨兩種選擇:(1) 讀取文件當(dāng)前位置的下一行文本到字符串;(2) 讀取整個文件的文本到字符串。如果是后者,你只需調(diào)用 ReadToEnd() 方法即可:
...
'現(xiàn)在,讀取整個文件的文本到字符串
Dim contents as String = objStreamReader.ReadToEnd()
...

但如果是前者呢?在讀取下一行文本之前,須得先確認尚有文本可讀。為此,可以嘗試 Peek() 方法。Peek() 方法能夠返回指定流的下一個文本字符,卻不把該字符從流中刪掉;如果流中不再有文本字符可讀,則返回 -1。接下來,只要循環(huán)遍歷 Peek() 的返回值:loop while objStreamReader.Peek() <> -1 ,并且在循環(huán)內(nèi)部使用 ReadLine() 方法讀取下一行文本就行了:

While objStreamReader.Peek() <> -1
someString = objStreamReader.ReadLine()
'... do whatever else you need to do ...
End While

切記!關(guān)閉 StreamReader 對象!

當(dāng)你讀完全部文本,并且不再操作此文件時,千萬記住要使用 Close() 方法關(guān)閉 StreamReader 對象,以關(guān)閉此文件。如果你忘記這么做,則 ASP.NET 操作進程將保持對此文件的只讀鎖定狀態(tài),因而當(dāng)你換用其它帳號操作此文件時將會遇到錯誤信息 “access denied”(拒絕訪問) ;而且當(dāng)你試圖刪除或覆蓋此文件時也將遇到同樣的錯誤信息;只不過 ASP.NET 本身對此文件的操作卻不受影響。因此,一定要在完成操作之后關(guān)閉文件。

附:完整的示范程序

<%@ Import Namespace="System.IO" %>
<script language="vb" runat="server">
sub Page_Load(sender as Object, e as EventArgs)
'以只讀方式打開一個文件
Dim FILENAME as String = Server.MapPath("Rand.txt")

'實例化一個 StreamReader 對象用于讀取文件
Dim objStreamReader as StreamReader
objStreamReader = File.OpenText(FILENAME)

'現(xiàn)在,讀入整個文件的文本并保存到一個字符串里
Dim contents as String = objStreamReader.ReadToEnd()

'在一個 Web 控件中顯示文本
lblRawOutput.Text = contents

'為了在便于瀏覽,最好把回車字符替換成 <br>
lblNicerOutput.Text = contents.Replace(vbCrLf, "<br>")

objStreamReader.Close()
end sub
</script>
<b>Raw File Output</b><br />
<asp:label runat="server" id="lblRawOutput" />
<p>
<b>Nicer Output</b><br />
<asp:label runat="server" id="lblNicerOutput" Font-Name="Verdana" />

結(jié)論

本文附帶了一個示范程序的源代碼。該程序簡單地打開一個硬編碼的(hard-coded)文本文件,然后把其中的所有文本一次性保存到指定字符串里,再把字符串的值顯示在服務(wù)器端的一個 Web 控件 label 中。
你看,通過 ASP.NET 頁面讀取文本文件內(nèi)容實在不難。雖然在語法上和經(jīng)典 ASP 的 FileSystemObject 對象有些差異,但是學(xué)起來真的很容易。為了更好的掌握如何在 ASP.NET 中讀寫文件,請務(wù)必閱讀 《ASP.NET: Tips, Tutorials, and Code》一書 (樣本見 http://www.4guysfromrolla.com/webtech/chapters/ASPNET2 )!