2 votes

La méthode ASP SaveToDisk prend un temps fou.

Il s'agit d'une méthode en ASP Classic qui enregistre un fichier sur le disque. Cela prend beaucoup de temps, mais je ne sais pas pourquoi. Normalement, ça ne me dérangerait pas tant que ça, mais les fichiers qu'il manipule sont assez volumineux et il faut que ça aille plus vite que 100 ko par seconde. Sérieusement lent (ancien système, solution de fortune jusqu'à ce qu'il soit remplacé...).

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

Je pose la question parce qu'il y a beaucoup de WTF dans ce code et je lutte contre ces feux tout en demandant de l'aide pour ceux-là.

1voto

SqlRyan Points 14999

Je ne vois pas la définition de "FileData" dans votre code - d'où cela vient-il ? Y a-t-il une raison pour que vous écriviez sur le disque un seul caractère à la fois ? Je soupçonne que c'est votre problème - l'écriture de 100K de données nécessite 100K voyages dans cette boucle, ce qui pourrait être la raison de votre ralentissement. Pourquoi ne pas remplacer la boucle d'écriture en bas :

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

avec une seule déclaration pour écrire le fichier en une seule fois ?

oFile.Write FileData

1voto

Thomas Kjørnes Points 1360

Ce que vous devez faire, c'est lire la requête binaire dans un objet ADODB.Stream et la convertir en texte ASCII brut en une seule étape rapide.

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

Remarquez que la variable FormData contient maintenant les données du formulaire sous forme de texte. Ensuite, vous analysez ce texte et localisez le début et la longueur de chaque fichier, et utilisez la méthode ADODB.Stream CopyTo pour extraire la partie spécifique du fichier et la sauvegarder sur le disque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X