Avatar billede foralias Praktikant
26. oktober 2007 - 14:57 Der er 18 kommentarer og
1 løsning

Gemme aktuel side på serveren

Hej jeg har et stort problem. Det haster som en i ........
Derfor også alle de pts.

Jeg har en asp side, som skal vise nogle data fra en database.
Samtidig med at siden er oppe i browseren vil jeg gerne have den gemmer en HTML kopi på serveren så den kan findes senere.
Jeg har kigget lidt på FSO er det vejen frem?
Avatar billede w13 Novice
26. oktober 2007 - 16:12 #1
Det kunne det være. Hvor skal det gemmes?

Du kan gøre det med følgende kode:

Set fs=Server.CreateObject("Scripting.FileSystemObject").GetFile("c:\test.txt")
fs.Copy("c:\new_test.txt",false)
Set fs=nothing

False i Copy betyder, at den ikke overskriver, hvis der allerede eksisterer en fil med det navn. Sæt den til true, hvis den skal.
Avatar billede w13 Novice
26. oktober 2007 - 16:17 #2
Ahr, nej. Den gemmer selvfølgelig også ASP-koderne og ikke resultatet. Hmmm..

Kunne du ikke bare generere en ny fil kun med HTML-outputtet fra databasen? Hvad skal det bruges til?
Avatar billede w13 Novice
26. oktober 2007 - 16:21 #3
Ellers er der vist en løsning her: http://www.freevbcode.com/ShowCode.Asp?ID=110
Avatar billede soerenlyn Nybegynder
26. oktober 2007 - 16:22 #4
Hvis de ting du skal gemme laves i asp'en, så kan du jo imens at du henter tingene fra db, lave en string med al html'en der bliver genereret. Når du så er færdig, så skriver du den string til en fil med FSO - som du selv foreslår.

<%
fs=Server.CreateObject("Scripting.FileSystemObject")
.CreateTextFile("c:\test.txt",true)
fs.WriteLine(ASPSTRING)
fs.Close
set fs=nothing
%>
Avatar billede foralias Praktikant
26. oktober 2007 - 16:36 #5
w13 -> den skal gemmes på serveren.
soerenlyn -> Kan se den gemmes som txt fil, den skulle gemme HTML men det er måske ligegyldigt?

Filen skal bruges for at andre kan se hvad pågældende bruger har fået en kopi af den gang han lavede den, altså en slags "backup" af nøjagtig den samme visning.
Avatar billede softspot Forsker
26. oktober 2007 - 17:47 #6
Hvis strengen der gemmes, er det du også sender til brugerens browser (med response.write), så vil filen der gemmes indeholde det samme (uanset om den hedder .txt) - men det er jo frit for dig om du vil kalde den .htm i stedet... :)
Avatar billede softspot Forsker
26. oktober 2007 - 17:50 #7
Du skal så sørge for at erstatte alle dine Response.Write-sætninger med en strengbuffer for at du kan gemme indholdet til en fil. Du kan f.eks. lave en strengbuffer med et array som du så join'er til en streng efter siden er genereret. Det er væsentlig hurtigere end at lave strengsammensætning med ampersand (&).
Avatar billede soerenlyn Nybegynder
26. oktober 2007 - 17:52 #8
Ja hvad du kalder navnet er ligegyldigt. Hvis koden ligge i en .txt-fil, så kan du bare læse det fra .txt-filen igen..
Avatar billede w13 Novice
26. oktober 2007 - 19:32 #9
Men det kræver, at du genererer al HTML-kode med ASP.
Avatar billede soerenlyn Nybegynder
26. oktober 2007 - 19:52 #10
Ja. Eller at du putter det HTML du ikke generere i ASP ind i en variabel i ASP, og så gemmer det med i filen.
Avatar billede foralias Praktikant
26. oktober 2007 - 20:19 #11
Ok så prøver jeg lige om jeg kan skrue et eller andet sammen. Er der nogen grænse for hvor stor en variabel kan blive? Jeg tænker lidt på om der evt. komme lidt problemer, for siden kan godt risikere at blive MEGET stor.
Avatar billede w13 Novice
26. oktober 2007 - 20:32 #12
Jeg har aldrig oplevet problemer med store variabler. Men jeg ved det faktisk ikke.
Avatar billede foralias Praktikant
26. oktober 2007 - 20:54 #13
Ok, jamen så må vi jo se om jeg støder på toppen :-)
Avatar billede softspot Forsker
26. oktober 2007 - 22:01 #14
Der er naturligvis en grænse for hvor stor en streng kan blive og den teoretiske grænse for en streng i VBScript er nok omkring 2Gb (jeg håber ikke det er så store side du afleverer til dine brugere! :D)...

Men du kan løbe i nogle gevaldige performanceproblemer, hvis du ikke fra starten optimerer din strenghåndteringsprocess. VBScript er notorisk langsom til almindelige strengsammensætninger, specielt hvis de bliver store og der er mange af dem. Jeg har lavet nogle tests på et tidspunkt og det var altså voldsomme forskelle på en array-baseret strengbuffer og normal strengsammensætning.

Følgende burde give dig et performanceboost på denne front (jeg har godt nok ikke testet den, men princippet burde være til at overskue):


class StringBuilder
  private m_buffer()  ' bufferen som skal holde de enkelte strengelementer
  private m_lastIdx    ' sidste indsættelsesposition i bufferen
  private m_bufferlen  ' antal elementer bufferen skal indeholde
  private m_bufferinc  ' antal elementer bufferen skal udvides med ved overløb

  sub class_terminate()
    m_lastIdx = 0
    m_bufferlen = 1000
    m_bufferinc = 500
    redim m_buffer(m_bufferlen)
  end sub

  property get bufferlen
    bufferlen = m_bufferlen
  end property

  property let bufferlen(value)
    m_bufferlen = value
    dim tmp
    tmp = toString
    redim m_buffer(m_bufferlen)
    m_buffer(0) = tmp
    m_lastIdx = 1
  end property

  property get bufferinc
    bufferinc = m_bufferinc
  end property

  property let bufferinc(value)
    m_bufferinc = value
  end property

  sub append(s)
    if m_lastIdx > m_bufferlen then
      bufferlen = bufferlen + bufferinc           
    end if
    m_buffer(m_lastIdx) = s
  end sub

  function toString()
    toString = join(m_buffer,"")
  end function
end class

' TEST KLASSEN!
dim sb
set sb = new StringBuilder

for i = 1 to 2000
  sb.append "Dette skal blive"
  sb.append " til en længere streng"
  sb.append " og dette er element nr.: "
  sb.append i
next


' SEND INDHOLDET AF BUFFEREN TIL BROWSEREN
Response.Write sb.toString
Avatar billede softspot Forsker
26. oktober 2007 - 22:11 #15
OK, har lige testet lidt og der var nogle småbugs som er rettet og denne version burde fungere:

<%
class StringBuilder
  private m_buffer()  ' bufferen som skal holde de enkelte strengelementer
  private m_lastIdx    ' sidste indsættelsesposition i bufferen
  private m_bufferlen  ' antal elementer bufferen skal indeholde
  private m_bufferinc  ' antal elementer bufferen skal udvides med ved overløb

  sub class_initialize()
    m_lastIdx = 0
    m_bufferlen = 1000
    m_bufferinc = 500
    redim m_buffer(m_bufferlen)
  end sub

  property get bufferlen
    bufferlen = m_bufferlen
  end property

  property let bufferlen(value)
    m_bufferlen = value
    dim tmp
    tmp = toString
    redim m_buffer(m_bufferlen)
    m_buffer(0) = tmp
    m_lastIdx = 1
  end property

  property get bufferinc
    bufferinc = m_bufferinc
  end property

  property let bufferinc(value)
    m_bufferinc = value
  end property

  sub append(s)
    if m_lastIdx > m_bufferlen then
      bufferlen = bufferlen + bufferinc           
    end if
    m_buffer(m_lastIdx) = s
  m_lastIdx = m_lastIdx + 1
  end sub

  function toString()
    toString = join(m_buffer,"")
  end function
end class

' TEST KLASSEN!
dim sb
set sb = new StringBuilder

for i = 1 to 2000
  sb.append "Dette skal blive"
  sb.append " til en længere streng"
  sb.append " og dette er element nr.: "
  sb.append i
next

' SEND INDHOLDET AF BUFFEREN TIL BROWSEREN
Response.Write sb.toString

%>
Avatar billede foralias Praktikant
29. oktober 2007 - 15:18 #16
softspot -> Jeg håber ikke at den kommer til at overskride 2 GB :-)

Det virker fint så dem der vil have pts. skal lige smide et svar :-)
TAK FOR HJÆLPEN!!!!!!!
Avatar billede softspot Forsker
29. oktober 2007 - 15:54 #17
Velbekomme :)
Avatar billede foralias Praktikant
09. november 2007 - 08:36 #18
Det ser ud til du får puljen softspot :-)
Avatar billede softspot Forsker
09. november 2007 - 08:50 #19
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester