一简介 在现实世界中人们经常希望能够把某个文本文件的部分或全部内容保存到一个 Web 网页变量中在经典的 ASP 中只要简单地使用 FileSystemObject 就能做到了其实在 ASPFAQscom 中就有一个 FAQ 栏目专门讨论 FileSystemObject 可是在 ASPNET 中呢?FileSystemObject 当然还可以用不过经验表明这么做会严重影响服务器性能因此最好还是使用 NET 框架本身提供的类来读取文件本文要介绍的是如何读取文本文件今后我还会介绍如何使用 NET 框架类来读取 XML 文件
1File ? FileInfo ?
在 NET 框架中有许多方法可以打开文本文件有趣的是所有这些方法集中在 SystemIO 名字空间的两个类中它们是 File 类和 FileInfo 类两个类之间的区别很小File 类的方法全都是共享方法(静态方法)而FileInfo 类有例外共享方法就是不用创建类实例也能调用的方法假设要用这两个类删除文件则可以这么做
使用 File 类
FileDelete(fileName)
使用 FileInfo 类
Dim fInfo as FileInfo
fInfo = new FileInfo(fileName)
fInfoDelete()
请注意File 类的 Delete 方法只带一个参数即待删的文件而且不必对 File 类进行实例化就能调用再来看 FileInfo 类它的 Delete 方法不带参数因为文件名在 FileInfo 类实例的构造器中指定
就我个人而言我偏爱 File 因此就拿它来作示范吧我敢打赌 File 类的效率稍微高那么一点点因为使用它就不会因为类的实例化而烦恼不过那只是猜测而已(如果感兴趣请不妨编程比较一下它们的性能当你完成之后请把结果告诉我!)
2打开文件
打开文本文件最简单的途径是调用 OpenText 方法它将按照 UTF (ASCII) 格式打开文本文件你还可以选择通用的 Open 方法以便指定文件操作模式(create/open/append/truncate) 操作权限 (read/write/readwrite) 和文件共享权限了可既然你只需要读取文本文件那么相对简单的 OpenText 方法也就足以应付了
OpenText 方法返回一个 StreamReader 对象只要访问该对象就能从刚才打开的文件中读取文本内容因此打开文件所用的 ASPNET 代码大致如下
<%@ Import Namespace=SystemIO %>
<script language=vb runat=server>
sub Page_Load(sender as Object e as EventArgs)
以只读方式打开文件
Dim FILENAME as String = ServerMapPath(Randtxt)
创建 StreamReader 类实例准备读取文件内容
Dim objStreamReader as StreamReader
objStreamReader = FileOpenText(FILENAME)
请注意代码的第一行导入了 SystemIO 命名空间这是因为 File 类就属于此命名空间还有在 Page_Load 事件处理程序中创建了一个字符串 FILENAME 其内容就是欲打开的文件的物理路径(比如 C:\Inetpub\wwwroot\Randtxt)最后在 ASPNET 中的 ServerMapPath 也和经典的 ASP 中相同 (为了更好地理解 ServerMapPath 请别忘了阅读位于 http://aspnetguysfromrollacom/webtech/shtml 的《Using ServerMapPath》)
3从文件中读取文本
现在你面临两种选择() 读取文件当前位置的下一行文本到字符串() 读取整个文件的文本到字符串如果是后者你只需调用 ReadToEnd() 方法即可
现在读取整个文件的文本到字符串
Dim contents as String = objStreamReaderReadToEnd()
但如果是前者呢?在读取下一行文本之前须得先确认尚有文本可读为此可以尝试 Peek() 方法Peek() 方法能够返回指定流的下一个文本字符却不把该字符从流中删掉如果流中不再有文本字符可读则返回 接下来只要循环遍历 Peek() 的返回值loop while objStreamReaderPeek() <> 并且在循环内部使用 ReadLine() 方法读取下一行文本就行了
While objStreamReaderPeek() <>
someString = objStreamReaderReadLine()
do whatever else you need to do
End While
切记!关闭 StreamReader 对象!
当你读完全部文本并且不再操作此文件时千万记住要使用 Close() 方法关闭 StreamReader 对象以关闭此文件如果你忘记这么做则 ASPNET 操作进程将保持对此文件的只读锁定状态因而当你换用其它帐号操作此文件时将会遇到错误信息 access denied(拒绝访问) 而且当你试图删除或覆盖此文件时也将遇到同样的错误信息只不过 ASPNET 本身对此文件的操作却不受影响因此一定要在完成操作之后关闭文件
附完整的示范程序
<%@ Import Namespace=SystemIO %>
<script language=vb runat=server>
sub Page_Load(sender as Object e as EventArgs)
以只读方式打开一个文件
Dim FILENAME as String = ServerMapPath(Randtxt)
实例化一个 StreamReader 对象用于读取文件
Dim objStreamReader as StreamReader
objStreamReader = FileOpenText(FILENAME)
现在读入整个文件的文本并保存到一个字符串里
Dim contents as String = objStreamReaderReadToEnd()
在一个 Web 控件中显示文本
lblRawOutputText = contents
为了在便于浏览最好把回车字符替换成 <br>
lblNicerOutputText = contentsReplace(vbCrLf <br>)
objStreamReaderClose()
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 FontName=Verdana />
二结论
本文附带了一个示范程序的源代码该程序简单地打开一个硬编码的(hardcoded)文本文件然后把其中的所有文本一次性保存到指定字符串里再把字符串的值显示在服务器端的一个 Web 控件 label 中
你看通过 ASPNET 页面读取文本文件内容实在不难虽然在语法上和经典 ASP 的 FileSystemObject 对象有些差异但是学起来真的很容易为了更好的掌握如何在 ASPNET 中读写文件请务必阅读 《ASPNET: Tips Tutorials and Code》一书 (样本见 http://wwwguysfromrollacom/webtech/chapters/ASPNET )!