代码之家  ›  专栏  ›  技术社区  ›  Dan

asp savetodisk方法花费了令人难以置信的时间

  •  2
  • Dan  · 技术社区  · 15 年前

    这是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 回复  |  直到 15 年前
        1
  •  1
  •   SqlRyan    15 年前

    我看不到你在代码中对“filedata”的定义——这是从哪里来的?你一次写一个字符到磁盘有什么原因吗?我怀疑这是你的问题-写10万个数据需要10万次循环,这可能是你减速的原因。为什么不能替换底部的write循环:

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

    一次只写一条语句来写文件?

    oFile.Write FileData
    
        2
  •  1
  •   Thomas Kjørnes    15 年前

    您应该做的是将二进制请求读入一个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
    

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