我成功运行下面的代码,逐行显示文本文件到浏览器:
<%
Filename = "/pages/test.txt"
Set FSO = server.createObject("Scripting.FileSystemObject")
Filepath = Server.MapPath(Filename)
Set file = FSO.GetFile(Filepath)
Set TextStream = file.OpenAsTextStream(1, -2)
Do While Not TextStream.AtEndOfStream
Line = TextStream.readline
Response.Write Line & "<br>"
Loop
Set TextStream = nothing
Set FSO = nothing
%>
我想在Do While Not TextStream.AtEndOfStream
语句之前再次运行Set TextStream = nothing
循环。
原来我不能“只”复制Do While
循环并将其放在第一个实例下面。 TextStream
不再有任何结果。
有没有办法将TextStream
对象重置回流的开头?
我可以将这些行存储在数组中并使用它,但我想知道是否有更简单的路径。
答案 0 :(得分:4)
不幸的是,没有办法手动将指针放在TextStream
对象中。您可以Close
TextStream
并重新打开它。或者,您可以将文件一次读入数组,如您暗示的那样。考虑到你将整个文件输出到一个网页,我认为它不是非常大,因此,将它存储在一个数组中不会太占用内存。
' Create an array containing each line from the text file...
a = Split(file.OpenAsTextStream(1, -2).ReadAll(), vbCrLf)
For i = 0 To UBound(a)
Response.Write a(i) & "<br>"
Next
' Repeat the process...
For i = 0 To UBound(a)
Response.Write a(i) & "<br>"
Next
您甚至可以用<br>
替换行结尾,并将其写入一个操作:
strText = Replace(file.OpenAsTextStream(1, -2).ReadAll(), vbCrLf, "<br>")
Response.Write strText
Response.Write strText ' Write it again
答案 1 :(得分:0)
TextStream
对象 Visual Basic脚本运行时中的TextStream
对象的功能非常有限。
阅读仅限前进,这意味着您无法返回流中的早期点。
写入是全部或全无,当文件以ForWriting
模式打开时,文件内容在被覆盖之前被截断(作为pointed out以避免这种使用{{ 1}})
ForAppending
对象!幸运的是ADODB.Stream
提供了一个更灵活的流媒体对象ADODB
,其中包括允许您打开文件(文本或二进制)并控制{{1}允许您从流中的较早点读取的属性。
喜欢的东西;
ADODB.Stream
显然,这只是一个关于如何使用Position
的(未经测试)的简单示例。值得注意的是,您可以通过将<%
Dim TextStream, Filename, Filepath
Filename = "/pages/test.txt"
Filepath = Server.MapPath(Filename)
Set TextStream = Server.CreateObject("ADODB.Stream")
Call TextStream.Open()
TextStream.Type = adTypeText
Call TextStream.LoadFromFile(Filepath)
Do While Not TextStream.EOS
Line = TextStream.ReadText(adReadLine)
Call Response.Write(Line & "<br>")
Loop
'Reset stream back to start of the stream
TextStream.Position = 0
Do While Not TextStream.EOS
Line = TextStream.ReadText(adReadLine)
Call Response.Write(Line & "<br>")
Loop
Call TextStream.Close()
Set TextStream = Nothing
%>
和ADODB.Stream
循环移动到可以重复使用的单独函数并减少复制来改进这一点。出于这个答案的目的,一直保持简单。