Tekstbestanden inlezen
TextReader
die karakters leest uit een bytestroom in een bepaalde codering.Probleem
Net als bij het schrijven van een bestand bestaat ook het lezen uit een bestand uit 4 stappen:
- Importeer de namespace
System.IO
. - Open van het bestand en creatie van
StreamReader
-object voor het bestand. - Lees uit het bestand.
- Sluiten van het bestand
Plaats de code voor het inlezen van een tekstbestand in een try catch finally blok.Het kan altijd gebeuren dat het bestand, dat je probeert in te lezen, niet bestaat. In de finally block sluit je de stream want die moet in beide gevallen gesloten worden.
public bool LeesMetFinally() { // we gaan ervan uit dat er iets misloopt bool result = false; StreamReader sr = null; try { // Creëer een instantie van de StreamReader klasse om // een bestand in te lezen. // De StreamReader wordt gesloten in het finally blok. sr = new StreamReader(this.fileName); // Lees tot het einde van het bestand this.text = sr.ReadToEnd(); result = true; } catch (Exception e) { // Schrijf hier de code die moet worden uitgevoerd // als er iets mis loopt } finally { sr.Close(); } return result; }
Je moet de StreamReader
buiten het try catch finally block declareren omdat de StreamReader
zowel in de try blok en als in de finally blok toegankelijk moet zijn. Daarenboven moet je instantie van StreamReader
initialiseren met null.
Dat moet je niet doen als je een using blok gebruikt om de stream te openen. In dat geval wordt de stream gesloten bij het afsluiten van de codeblok. Dit is de meest gebruikelijke manier in .NET.
public bool Lees() { // we gaan ervan uit dat er iets misloopt bool result = false; try { // Creëer een instantie van de StreamReader klasse om // een bestand in te lezen. // Het using statement sluit ook de StreamReader. using (StreamReader sr = new StreamReader(this.fileName)) { // Lees tot het einde van het bestand this.text = sr.ReadToEnd(); this.melding = String.Format( "Het bestand met de naam {0} is ingelezen.Het bevat {1} karakters en {2} woorden en {3} regels.", this.fileName, this.text.Length, this.text.Split(' ').Length, this.text.Split('\n').Length); result = true; } } catch (Exception e) { // Melding aan de gebruiker dat iets verkeerd gelopen is. // We gebruiken hier de nieuwe mogelijkheid van C# 6: string interpolatie this.melding = $"Kan het bestand met de naam {this.fileName} niet inlezen.\nFoutmelding {e.Message}."; } return result; }
Vermits deze klasse data ophaalt vanaf de harde schrijf uit een bestand dat extern is aan C#, plaatsen we die klasse in de Dal
namespace. We plaatsen de code in een bestand met de naam Tekstbestand.cs
en plaatsen het bestand in de App_Code/Dal
submap in de root van ons project. Indien je die submap nog niet gemaakt hebt, maak je die eerst. Zie onderstaande figuur.

Design
Velden
naam | bereik | type | omschrijving |
text | private | string | buffer voor de ingelezen text |
melding | private | string | foutmelding of melding dat het gelukt is |
fileName | private | string | de naam van het bestand dat ingelezen moet worden |
Eigenschappen
naam | bereik | type | omschrijving |
Text | public | string | getter en setter voor text |
Melding | public | string | getter en setter melding |
FileName | public | string | getter en setter vor fileName |
Methoden
naam | bereik | type | omschrijving |
Lees | public | boolean | open het bestand met de naam die staat in fileName en indien succesvol plaatst de tekst in de text buffer. Retourneert true indien succesvol anders false. |
Schrijf | public | boolean | Schrijft wat in de text buffer staat naar de harde schijf en geeft er de naam aan die staat in fileName.(nog te maken) |
Oplossing: App_Code/Dal/TekstBestand.cs
using System; using System.IO; namespace Dal { class Tekstbestand { private string text; public string Text { get { return text; } set { text = value; } } private string melding; public string Melding { get { return melding; } } private string fileName; public string FileName { get { return fileName; } set { this.fileName = value; } } public bool Lees() { // we gaan ervan uit dat er iets misloopt bool result = false; try { // Creëer een instantie van de StreamReader klasse om // een bestand in te lezen. // Het using statement sluit ook de StreamReader. using (StreamReader sr = new StreamReader(this.fileName)) { // Lees tot het einde van het bestand this.text = sr.ReadToEnd(); this.melding = String.Format( "Het bestand met de naam {0} is ingelezen.Het bevat {1} karakters en {2} woorden en {3} regels.", this.fileName, this.text.Length, this.text.Split(' ').Length, this.text.Split('\n').Length); result = true; } } catch (Exception e) { // Melding aan de gebruiker dat iets verkeerd gelopen is. // We gebruiken hier de nieuwe mogelijkheid van C# 6: string interpolatie this.melding = $"Kan het bestand met de naam {this.fileName} niet inlezen.\nFoutmelding {e.Message}."; } return result; } } }
Gebruik
Vermits je een nieuwe bibliotheek hebt toegevoegd kan het zijn dat je het project moet rebuilden. Vooraleer te rebuilden moet je eerst nog aangeven dat het Tekstbestand.cs geen content is maar code:
- open het Tekstbestand.cs in de Visual Studio Editor
- open het Property venster
- wijzig de Build Action eigenschap in Compile

Je kan die klasse gebruiken om bijvoorbeeld een csv bestand in te lezen. Je schrijft een methode die de inhoud van het bestand retourneert:
public string ReadFromCSVFile() { Dal.Tekstbestand bestand = new Dal.Tekstbestand(); bestand.FileName = @"C:\Programmeren 3\12716\LerenWerkenMetMVC\App_Data\Postcodes.csv"; bestand.Lees(); return bestand.Text; }