2

これは、ファイルをディスクに保存する ASP Classic のメソッドです。非常に時間がかかりますが、その理由はわかりません。通常、私はそれほど気にしませんが、処理するファイルはかなり大きいため、1 秒あたり 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がたくさんあるので、私はこれらの火事に助けを求めながらそれらの火事と闘っています。

4

2 に答える 2

1

バイナリ リクエストを ADODB.Stream オブジェクトに読み込み、それを 1 つの高速ステップでプレーン 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 メソッドを使用してファイルの特定の部分を抽出し、ディスクに保存します。

于 2010-05-06T17:05:52.053 に答える
1

コードのどこにも「FileData」の定義がありません。これはどこから来たのですか? 一度に1文字ずつディスクに書き込んでいる理由はありますか? これがあなたの問題だと思います-100Kのデータを書き込むには、このループを100Kトリップする必要があり、これが速度低下の原因である可能性があります。一番下の書き込みループを置き換えられないのはなぜですか:

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

ファイルを一度に書き込む単一のステートメントで?

oFile.Write FileData
于 2010-04-27T15:51:44.923 に答える