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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.