在ASP.NET页中读取文本文件

asp.net

简介
在现实世界中,人们经常希望能够把某个文本文件的部分或全部内容保存到一个 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" />

结论

本文附带了一个示范程序的源代码。该程序简单地打开一个硬编码的(hard-coded)文本文件,然后把其中的所有文本一次性保存到指定字符串里,再把字符串的值显示在服务器端的一个 Web 控件 label 中。
你看,通过 ASP.NET 页面读取文本文件内容实在不难。虽然在语法上和经典 ASP 的 FileSystemObject 对象有些差异,但是学起来真的很容易。为了更好的掌握如何在 ASP.NET 中读写文件,请务必阅读 《ASP.NET: Tips, Tutorials, and Code》一书 (样本见 http://www.4guysfromrolla.com/webtech/chapters/ASPNET2 )! 

时间: 2025-01-30 04:50:33

在ASP.NET页中读取文本文件的相关文章

求大神指教-在c++控制台程序中读取文本文件

问题描述 在c++控制台程序中读取文本文件 我是新手,刚刚入门,学校安排了一个暑期项目,做一个球员信息管理系统. 把数据存储在txt文件中,怎样才可以有序的读取我要找的数据,包括球员的赛季数据个个人信息.... 解决方案 C++读取文本文件 解决方案二: 那要看你是怎么存储的数据,什么顺序存储的就怎么读.可以一个球员的信息占一行,或者xxx个字节.然后一个一个球员的读出来. 解决方案三: 最简单的,可以用json文件等来存取,这样用jsoncpp等可以方便读取,解析数据. 解决方案四: 先定义一

asp.net页能够读取自已网站中某页上的资料吗?

问题描述 情况是这样的.有个asp.net页default.aspx.之下是一个文件夹,会不断地放入html静态页面.有多少是不知道的.这个default.aspx能否读到这些html的<title></title>信息.在自身页面上生成一个list.到数据库读取数据就多了.现在要读取自身网站内的信息.asp.net能否办到呢? 解决方案 解决方案二:应该办是能办到不过存在效率问题呀至少要有类似缓存之类的机制解决方案三: 解决方案四:楼上说的对.可以做的,可是效率是大问题.解决方案

在ASP.NET页中检测浏览器类型

asp.net|浏览器 本文引自VS帮助文档查询 Browser 属性,该属性包含一个 HttpBrowserCapabilities 对象.在 HTTP 请求过程中,该对象会从浏览器或客户端设备中获取信息,以便让您的应用程序知道浏览器或客户端设备提供的支持类型和级别.该对象随后使用强类型属性和泛型名称值字典公开有关浏览器功能的信息. 下面的代码示例演示如何在页上的文本框中显示浏览器信息.=======Visual Basic =======Private Sub Button1_Click(B

技巧:在ASP.NET页中检测浏览器类型

asp.net|技巧|浏览器 本文引自VS帮助文档查询 Browser 属性,该属性包含一个 HttpBrowserCapabilities 对象.在 HTTP 请求过程中,该对象会从浏览器或客户端设备中获取信息,以便让您的应用程序知道浏览器或客户端设备提供的支持类型和级别.该对象随后使用强类型属性和泛型名称值字典公开有关浏览器功能的信息. 下面的代码示例演示如何在页上的文本框中显示浏览器信息.=======Visual Basic =======Private Sub Button1_Clic

asp.net页中动态加入样式表文件

asp.net|动态|样式表 由于在某些时候为了节省样式表下载的开销,我们会将CSS分存在不同的文件中,调用的时候只用能用到的在基于模板页的.net WEB 编程中有时会遇到这样的问题:如何将CSS的样式表文件动态添加到HEAD标签中呢 过去我也想过一些方法 比如直接在HEAD里写些IF ELSE语句,来判断当前的访问页 不过这样作肯定不是最好的选择下面我就介绍另一种比较好的方法来添加 在页面的page_init中写以下代码    Protected Sub Page_Init(ByVal se

asp.net2.0中读取web.config数据库连接字符串2种方法

asp.net|web|数据|数据库|数据库连接|字符串 方法一: string myConn = System.Configuration.ConfigurationManager.ConnectionStrings["sqlConnectionString"].ConnectionString; 方法二: string connString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings[&q

使用 System.IO 和 Visual C# .NET 读取文本文件

visual 使用 System.IO 和 Visual C# .NET 读取文本文件 在 Visual C# .NET 中读取文本文件 打开和读取文件进行读取访问是输入/输出 (IO) 功能的一个非常重要的部分,即使您不需要写入到相关文件,也是如此. 本示例打开一个文件进行读取,这适用于读取文本文件,但不适用于读取二进制文件. 本示例使用多个可用于打开文件的方法之一. 虽然很多数据结构都可以用于存储从文件中检索到的信息,但是,arraylist 类是使用最简便的结构. 为了打开文件和从文件中读

开发人员如何调试ASP页中的脚本对象 (3)

对象|脚本 跟踪事件当一个ASP页使用脚本对象模型时,单独脚本对象触发事件对状态改变(如Recordset1_ondatasetcomplete)或用户行为(如Button1_onclick)进行反应.通常,你需要知道你自己的脚本及由脚本对象模型触发的事件在什么时候执行. 为此,通过把@trace 或 @trace事件选项设置为true来打开事件跟踪.如果你使事件跟踪有效,当事件发生时,事件信息就被写到ASP页中.例如,ASP页的一部分可能像下面这个样子: EVENT TRACE: thisPa

开发人员如何调试ASP页中的脚本对象 (2)

对象|脚本 调试和脚本库因为脚本对象本身是用脚本编写的,调试你编写的和脚本对象模型相互作用的脚本可能就很复杂,这有以下几个原因: 首先,当你利用调试器单步执行你自己的脚本时,你可能会进入不熟悉的并且非常复杂的脚本库代码中.其次,如果在脚本库内部发生了一个错误,单步执行它可能会是冗长乏味的,并且还不一定能帮你查明错误.最后,有时追随事件次序及脚本和脚本对象模型之间的控制流可能是很困难的. 现在,你可以利用下面这些脚本对象模型调试选项在这些环境下调试你的应用程序: 捕捉低层错误(Catch low-