如何重新运行TextStream.AtEndOfStream

时间:2015-07-22 19:36:20

标签: vbscript asp-classic do-while filesystemobject

我成功运行下面的代码,逐行显示文本文件到浏览器:

<% 
    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对象重置回流的开头?

我可以将这些行存储在数组中并使用它,但我想知道是否有更简单的路径。

2 个答案:

答案 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循环移动到可以重复使用的单独函数并减少复制来改进这一点。出于这个答案的目的,一直保持简单。

更多信息