如何重新运行 TextStream.AtEndOfStream

How to Rerun the TextStream.AtEndOfStream

我成功地运行使用下面的代码逐行向浏览器显示文本文件:

<% 
    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 语句之前。

原来我无法"just" 复制Do While 循环并将其放在第一个实例的下方。 TextStream 不再有结果。

有没有办法将 TextStream 对象重置回流的开头?

我可以将这些线存储在一个数组中并加以利用,但我想看看是否有更简单的路线。

遗憾的是,无法手动将指针定位在 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

TextStream 对象的限制

Visual Basic 脚本运行时中的 TextStream 对象的功能非常有限。

  • 阅读仅向前,这意味着您不能返回到流中的较早点。

  • 写入是全有或全无,当文件以ForWriting模式打开时,文件的内容在被覆盖之前被截断(如为避免这种情况,请使用 ForAppending).

还有其他方法吗?

介绍 ADODB.Stream 对象!

幸运的是,ADODB 提供了一个更为灵活的流对象,称为 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。值得注意的是,您可以通过将 TextStream.Position = 0Do While 循环移动到一个单独的函数中来改进这一点,该函数可以重复使用并减少重复。然而,为了这个答案的目的,保持简单。


更多信息