Dateien auslesen mit VB.NET
Geschrieben von: Christian Holm 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. Der AnfangNachdem 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. Alles BinärHö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. SchlußbemerkungVB.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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Dateien lesen in ASP.NET Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |