ASP SaveToDisk方法需要花费大量时间

时间:2010-04-27 14:38:52

标签: asp-classic save performance hard-drive

这是ASP Classic中将文件保存到磁盘的方法。这需要很长时间,但我不确定为什么。通常情况下,我不介意这么多,但它处理的文件非常大,所以需要比每秒100kB更快的速度。严重慢。 (旧的遗留系统,乐队援助修复,直到它被取代......)

Public Sub SaveToDisk(sPath)
        Dim oFS, oFile
        Dim nIndex

        If sPath = "" Or FileName = "" Then Exit Sub

        If Mid(sPath, Len(sPath)) <> "\" Then sPath = sPath & "\"  '"

        Set oFS = Server.CreateObject("Scripting.FileSystemObject")
        If Not oFS.FolderExists(sPath) Then Exit Sub

        Set oFile = oFS.CreateTextFile(sPath & FileName, True)

        For nIndex = 1 to LenB(FileData)
            oFile.Write Chr(AscB(MidB(FileData,nIndex,1)))
        Next

        oFile.Close
    End Sub

我问,因为这段代码中有很多WTF,所以我在为这些火灾提供帮助的同时对抗这些火灾。

2 个答案:

答案 0 :(得分:1)

我在你的代码中的任何地方都没有看到你对“FileData”的定义 - 这是从哪里来的?你有没有理由一次将它写入磁盘一个字符?我怀疑这是你的问题 - 写100K的数据需要100K次通过这个循环,这可能是你减速的原因。为什么不能替换底部的写循环:

For nIndex = 1 to LenB(FileData)
    oFile.Write Chr(AscB(MidB(FileData,nIndex,1)))
Next

用一个语句一次写入文件?

oFile.Write FileData

答案 1 :(得分:1)

您应该做的是将二进制请求读入ADODB.Stream对象,并在一个快速步骤中将其转换为纯ASCII文本。

Set objStream = Server.CreateObject("ADODB.Stream")

    objStream.Type = 1
    objStream.Open
    objStream.Write Request.BinaryRead(Request.TotalBytes)
    objStream.Position = 0
    objStream.Type = 2
    objStream.Charset = "ISO-8859-1"

    FormData = objStream.ReadText

    objStream.Close

Set objStream = Nothing

注意变量FormData现在如何将表单数据包含为文本。然后解析此文本并找到每个文件的开始和长度,并使用ADODB.Stream CopyTo方法提取文件的特定部分并将其保存为磁盘。