Geschrieben von: Christian Holm
Kategorie: VB.NET
This printed page brought to you by AlphaSierraPapa
Heute erfahren Sie wie man mit VB.NET Dateien ausliest, und den Stream zum Browser des Client schickt. Natürlich sollen es nicht nur einfache Textdateien sein, nein, es werden heute auch anspruchsvollere Beispiele gezeigt. Da VB.NET meist ein bischen "Launisch" und "End Launisch" ist, wird dieser Artikel sicher interessant.
Auf AspHeute.com gibt es schon einige Artikel, die dieses Thema behandeln. Aber bis jetzt mußte die Programmiersprache VB.NET außen vor bleiben. Da es anscheinend noch eine große Anzahl von Programmierern gibt, die Visual Basic & Co. verwenden, muß wieder einmal ein Visual Basic Artikel her. Da VB.NET ja automatisch mit dem Microsoft .NET SDK mitinstalliert wird, sollen die paar Bytes auch mal zur Verwendung kommen.
Wie immer bei unseren ASP.NET Artikeln ist zu beachten, daß Sie nur dann vom downloadbaren Sourcecode profitieren können, wenn Sie das Microsoft .NET Framework SDK auf einem Webserver installiert haben. Damit werden auf diesem Webserver ASP.NET Seiten ( .aspx ) ausführbar.
Nachdem Sie alle Warnhinweise zu VB.NET gelesen haben, fangen wir sogleich mit dem ersten Beispiel an. Da es auch das erste ist, hat dieses nur die Aufgabe eine simple Text-only datei auszulesen. Damit es auch bei Ihnen daheim ohne System.IO.FileNotFoundException klappt, ist es die Beispieldatei selbst.
Bevor ich Ihnen das Ergebnis präsentiere, besprechen wir zuerst den interessanten Teil des Sourcecodes der ReadFile.aspx Datei:
StmReader = File.OpenText(Server.MapPath("ReadFile.aspx")) While (StmReader.Peek() <> -1) strLine = StmReader.ReadLine() strLine = Server.HtmlEncode(strLine) Response.Write(strLine & "<br>" & vbCrLf) End While StmReader.Close()
Nach den obligatorischen Referenzierungen, Variablendeklarationen, etc. weisen wir dem Stream(objekt) eine Datei zu - in diesem Fall sich selbst - und lesen mit der ReadLine Methode Zeile für Zeile der Datei. Da wir dies wie gesagt Zeile für Zeile tun, können wir mit kleinen Hilfsmitteln (<br>, etc.) die Formatierung des Sourcecodes beibehalten.
Die Peek Methode sieht nach, ob es nach der ausgelesenen Zeile noch was zu lesen gibt - bis zum bitteren Ende der Datei. Damit lösen wir elegant das Problem wenn der Text zwischendurch Leerzeilen enthält (VB.NET ist da etwas "komisch"). Nun will ich Sie nicht länger auf die Folter spannen, und die Runtime für mich werkeln lassen bzw. Ihnen den Screenshot mit dem Resultat, das dieser Sourcecode produziert, präsentieren:
Und tatsächlich wird der gesamte Inhalt ausgegeben, auch wenn Leerzeilen dazwischen sind. Das war ja einfachst! VB.NET kann aber mehr. Diesmal versuchen wir z.B. ein Bild in den Stream zu verpacken und diesen Stream zum Clientbrowser zu schicken.
Hört sich kompliziert an - ist es aber nicht. Das kennen wir bereits von der gesamten VB Dynastie. Fein, dann schauen wir uns gleich das nächste Beispiel an (BinaryWrite.aspx):
Response.Buffer = True Dim StmRead As Stream = File.OpenRead("G:\LocalSites\pic.png") Dim nBufferSize As Integer = 255 Dim nReadBytes As Integer = 0 Dim nTotalBytes As Integer = 0 Dim arrByte(nBufferSize) As Byte Response.ClearContent() Response.ContentType = "image/png" While (StmRead.Position < StmRead.Length) nReadBytes = StmRead.Read(arrByte, 0 , nBufferSize-1) nTotalBytes = nTotalBytes + nReadBytes If (nReadBytes = nBufferSize) Then Response.BinaryWrite(arrByte) Else Dim arrCopy(nReadBytes) As Byte Array.Copy(arrByte, 0, arrCopy, 0, nReadBytes) Response.BinaryWrite(arrCopy) End If End While 'CleanUp StmRead.Close() Response.End()
Normalerweise, wenn man den Puffer genügend groß wählt, könnte man auf die While Schleife verzichten, und den Binärstream sofort zum Client schicken. Aber den Puffer nicht an die tatsächliche Dateigröße anzupassen hat folgende zwei Vorteile: Einerseits haben Dateien meist eine unterschiedliche Größe, daher wäre es eine Verschwendung immer den gesamten Puffer auszulesen, wenn er nicht vollständig belegt wurde.
Andererseits wenn der Puffer zu klein ist, gibt es auch wieder Probleme. Bei solchen "speicherintensiven" Operationen (hängt natürlich von der Dateigröße ab), ist es wichtig die Resourcen sofort nachdem sie nicht mehr benötigt werden wieder frei zugeben (CleanUp). Es heißt zwar allgemein, daß sich der Garbage Collector (GC) darum kümmert, aber es dauert so seine Zeit bis er mit dem Management fertig ist.
Daher ist es schneller und sicherer ihm die Arbeit abzunehemen - nicht nur während dem Entwickeln. Man kennt ja Sprüche wie "File still in use" oder "Access Violation ...". Nun aber wieder der Screenshot zu Datei:
Da es natürlich wie immer mehrere Lösungen für ein Problem gibt, möchte ich auch heute nicht Ihnen eine Alternative vorenthalten:
... objFileStream = New FileStream("G:\LocalSites\pic.png", FileMode.Open) lFileSize = objFileStream.Length Response.ClearContent() Response.ContentType = "image/png" Dim bBuffer(CInt(lFileSize)) As Byte objFileStream.Read(bBuffer, 0, CInt(lFileSize)) objFileStream.Close() Response.BinaryWrite(bBuffer) ...
Dieser Sourcecode fragt gar nicht erst lang, und will sofort die Größe (Length Methode) des Filestreams wissen. Entsprechend der Größe des Filestreams wird das Byte-Array dimensioniert. Danach wird der Stream wie gewohnt zum Browser geschickt. Das Ergebnis ist natürlich das gleiche wie im vorigen Beispiel.
VB.NET zieht natürlich dem Platzhirsch C# nach und bietet dank .NET (zum Teil) äquivalente Features. Damit beweist sich VB.NET als schnell erlernbare und zeitgemäße Alternative u. a. für Visual Basic Programmierer, die ihrer Linie treu bleiben möchten. Wenn auch zur Lösung eines Problems mehrere Schritte als in C# nötig sind.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010221.zip
Dateien lesen in ASP.NET
http:/www.aspheute.com/artikel/20000929.htm
Dateiupload mit ASP.NET und VB.NET
http:/www.aspheute.com/artikel/20010124.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.