Un'alternativa all'uso di Stream per la lettura di file binari: TextStream di FSO

di Giuseppe Amato, in Classic ASP, UserScript, FSO,

L'oggetto TextStream di FSO può in realtà essere utilizzato per leggere e scrivere file binari.
In Visual Basic e VBScript, infatti, le strighe possono contenere qualsiasi carattere, anche il NULL-char, che non assume nessun significato speciale, in quanto le stringhe in VBS/VB non sono NULL terminated come in C, ma hanno un campo che ne memorizza la lunghezza.
Detto ciò, basta leggere un file binario come un normalissimo file ASCII, con la funzione Read(size) dell'oggetto TextStream: questa restituisce una stringa che contiene i dati del file binario senza che essi siano stati cambiati di una virgola.
Tutto sta adesso nel convertire tale BynaryString che abbiamo letto in un array di bytes, o viceversa, un array di bytes che vogliamo scrivere in una BinaryString.
Ci sono vari modi per effettuare queste conversioni, ecco un paio di esempi:

<%
Function StringToBinary(String)
  Dim I, B
  For I=1 to len(String)
    B = B & ChrB(Asc(Mid(String,I,1)))
  Next
  StringToBinary = B
End Function

Function MBBinaryToString(Binary)
  dim c1, c2, c3, p1, p2, p3
  Dim L
  c1 = 1 :  c2 = 1 : c3 = 1
  L = LenB(Binary)
  
  Do While c1<=L
    p3 = p3 & Chr(AscB(MidB(Binary,c1,1)))
    c1 = c1 + 1 : c3 = c3 + 1
    if c3>300 then
      p2 = p2 & p3
      p3 = ""
      c3 = 1
      c2 = c2 + 1
      if c2>200 then
        p1 = p1 & p2
        p2 = ""
        c2 = 1
      End If
    End If
  Loop
  MBBinaryToString = p1 & p2 & p3
End Function

%>

Di seguito un semplice esempio, l'upload di un file qualsiasi al client.
L'esempio è stato tratto dallo script "download.asp", disponibile come allegato

<%

server.ScriptTimeout = 16200
response.buffer = true
response.contentType = "application/octet-stream"

set fs = Server.CreateObject ("Scripting.FileSystemObject")
set binfile = fs.OpenTextFile(server.mappath(".\mybinfile.exe))
fileSize = binfile.size
 for i = 1 to fileSize
  if not Response.IsClientConnected then
    binfile.close
    set binfile a = Nothing
    response.clear
    response.end
  end if
  response.binarywrite StringToBinary(binfile.read(1024*16))
  response.flush
next

binfile.close
set binfile  = Nothing

%>

Su questa lista in passato è già apparso uno script simile, che utilizza un oggetto non documentato di ADO, Stream, per leggere file binari.
Questo oggetto legge qualsiasi tipo di file, ma è efficace esclusivamente per file molto piccoli: inatti esso carica in memoria tutto il contenuto dei file, quando si usa l'istruzione Load.
Il file rimane quindi in memoria fino a quando non lo si chiude e questo con file molto grandi può mandare in crisi il sistema.
L'oggetto TextStream, invece, non legge tutto il file quando lo si apre e pone in memoria esattamente la quantità di bytes che gli si dice di leggere di volta in volta e rappresenta dunque una valida alternativa all'utilizzo di ADODB.Stream.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi