ASP.NET頁中讀取文字檔

來源:互聯網
上載者:User
簡介
在現實世界中,人們經常希望能夠把某個文字檔的部分或全部內容儲存到一個 Web 網頁變數中。在經典的 ASP 中,只要簡單地使用 FileSystemObject 就能做到了。其實,在 ASPFAQs.com 中就有一個 FAQ 欄目專門討論 FileSystemObject 。
可是在 ASP.NET 中呢?FileSystemObject 當然還可以用,不過,經驗表明這麼做會嚴重影響伺服器效能。因此,最好還是使用 .NET 架構本身提供的類來讀取檔案。本文要介紹的是如何讀取文字檔;今後我還會介紹如何使用 .NET 架構類來讀取 XML 檔案。

File ? FileInfo ?

在 .NET 架構中,有許多方法可以開啟文字檔。有趣的是,所有這麼方法集中在 System.IO 名字空間的兩個類中。它們是 File 類和 FileInfo 類。兩個類之間的區別很小。File 類的方法全都是共用方法(靜態方法),而FileInfo 類有例外。共用方法就是不用建立類執行個體也能調用的方法。假設要用這兩個類刪除檔案,則可以這麼做:

'使用 File 類
File.Delete(fileName)

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

請注意,File 類的 Delete 方法只帶一個參數,即待刪的檔案,而且不必對 File 類進行執行個體化就能調用。再來看 FileInfo 類,它的 Delete 方法不帶參數,因為檔案名稱在 FileInfo 類執行個體的構造器中指定。

就我個人而言,我偏愛 File ,因此就拿它來作示範吧。我敢打賭 File 類的效率稍微高那麼一點點,因為使用它就不會因為類的執行個體化而煩惱;不過那隻是猜測而已。(如果感興趣,請不妨編程比較一下它們的效能。當你完成之後,請把結果告訴我!)

開啟檔案

開啟文字檔最簡單的途徑是調用 OpenText 方法,它將按照 UTF-8 (ASCII) 格式開啟文字檔。你還可以選擇通用的 Open 方法,以便指定檔案操作模式 (create/open/append/truncate) 、操作許可權 (read/write/read-write) 和檔案分享權限設定許可權了;可既然你只需要讀取文字檔,那麼相對簡單的 OpenText 方法也就足以應付了。
OpenText 方法返回一個 StreamReader 對象,只要訪問該對象就能從剛才開啟的檔案中讀取常值內容。因此,開啟檔案所用的 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")

'建立 StreamReader 類執行個體,準備讀取檔案內容
Dim objStreamReader as StreamReader
objStreamReader = File.OpenText(FILENAME)
...

請注意,代碼的第一行匯入了 System.IO 命名空間。這是因為 File 類就屬於此命名空間。還有,在 Page_Load 事件處理常式中,建立了一個字串 FILENAME ,其內容就是欲開啟的檔案的實體路徑(比如 C:\Inetpub\wwwroot\Rand.txt)。最後,在 ASP.NET 中的 Server.MapPath 也和經典的 ASP 中相同 (為了更好地理解 Server.MapPath ,請別忘了閱讀位於 http://aspnet.4guysfromrolla.com/webtech/121799-1.shtml 的《Using Server.MapPath》)。

從檔案中讀取文本

現在,你面臨兩種選擇:(1) 讀取檔案當前位置的下一行文本到字串;(2) 讀取整個檔案的文本到字串。如果是後者,你只需調用 ReadToEnd() 方法即可:
...
'現在,讀取整個檔案的文本到字串
Dim contents as String = objStreamReader.ReadToEnd()
...

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

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

切記!關閉 StreamReader 對象!

當你讀完全部文本,並且不再操作此檔案時,千萬記住要使用 Close() 方法關閉 StreamReader 對象,以關閉此檔案。如果你忘記這麼做,則 ASP.NET 操作進程將保持對此檔案的唯讀鎖定狀態,因而當你換用其它帳號操作此檔案時將會遇到錯誤資訊 “access denied”(拒絕訪問) ;而且當你試圖刪除或覆蓋此檔案時也將遇到同樣的錯誤資訊;只不過 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")

'執行個體化一個 StreamReader 對象用於讀取檔案
Dim objStreamReader as StreamReader
objStreamReader = File.OpenText(FILENAME)

'現在,讀入整個檔案的文本並儲存到一個字串裡
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" />

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.