30
Pfade, Text-Dateien und Binäre Dateien Lesen und Schreiben von Dateien Dr. Beatrice Amrhein

Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Pfade, Text-Dateien und Binäre Dateien

Lesen und Schreiben von Dateien

Dr. Beatrice Amrhein

Page 2: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Überblick

� Der Verzeichnis-Pfad

� Kopieren, Verschieben, Ändern oder Löschen von Dateien

� Lesen und Schreiben von Text-Dateien

� Zeilenweises Lesen und Schreiben von Text-Dateien

� Lesen und Schreiben von Binär-Dateien

2Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 3: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Der Verzeichnis-Pfad

3

Page 4: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Definition

Je nach Betriebssystem besteht ein Pfad aus folgenden Elementen:

� einer Laufwerks- oder Datenträgerbezeichnung

� einer Liste von Verzeichnissen bzw. (Unter-)Verzeichnissen

� und einem Dateinamen (mit Endung)

4Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 5: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Verzeichnis-Pfad in Windows

� Laufwerksbezeichnung Zum Beispiel C:

� Verzeichnisse und UnterverzeichnisseZum Beispiel \Users\aeb1\CSharp\

� DateinameZum Beispiel Test.txt

Zusammengesetzt ergibt dies dannden Verzeichnis-Pfad:

C:\Users\aeb1\CSharp\Test.txt

5Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 6: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Verzeichnis-Pfad in Mac OS

� Laufwerksbezeichnung Zum Beispiel /MacHD

� Verzeichnisse und UnterverzeichnisseZum Beispiel /Dokumente/CSharp

� DateinameZum Beispiel Test.txt

Zusammengesetzt ergibt dies dann den Verzeichnis-Pfad:

/MacHD/Dokumente/CSharp/Test.txt

6Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 7: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Die C# Klasse Path

� Stellt statische Methoden für String-Objekte, welche Dateinamen oder Verzeichnispfade enthalten, zur Verfügung.

� Diese Methoden funktionieren für alle Plattformen gleich.

Einige Methoden der Klasse Path sind

7Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Befehl Beschreibung

GetFullPath(fileName) Gibt den (ganzen) Verzeichnispfad des Files mit Namen fileName (relativ oder absolut ) als String zurück.

GetDirectoryName(fullPath) Gibt den Namen des Verzeichnispfades ohne den File-Namen zurück.

GetPathRoot(fullPath) Gibt den Namen des Wurzelverzeichnisses (Laufwerk oder Volumen) des Pfades zurück.

GetFileName(fullPath) Gibt den Namen des Files unter diesem Verzeichnis-Pfades zurück.

GetExtension(fileName) Gibt die File-Endung des File-Namens zurück.

Page 8: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

using System;

using System.IO;

class Program

{

static void Main(string[] args)

{

string fileName = "bsp1.exe";

string fullPath = Path.GetFullPath(fileName);

Console.WriteLine("GetFullPath({0}) \n gibt\n{1}", fileName, fullPath);

string directoryName = Path.GetDirectoryName(fullPath);

Console.WriteLine("GetDirectoryName({0}) \n gibt\n{1}",

fullPath, directoryName);

8Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Name des erzeugten

.exe Files

Page 9: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

string pathRoot = Path.GetPathRoot(fullPath);

Console.WriteLine("GetPathRoot({0}) \n gibt\n{1}", fullPath, pathRoot);

string extension = Path.GetExtension(fileName);

Console.WriteLine("GetExtension({0}) \n gibt\n{1}", fileName, extension);

string result = Path.GetFileName(fullPath);

Console.WriteLine("GetFileName({0}) \n gibt\n{1}", fullPath, result);

9Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 10: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein zweites Beispiel

class Program

{

static void Main(string[] args)

{

/* Vorsicht: Doppelte Backslash!! */

string fileName = "C:\\tmp\\CSharp\\Test.txt";

string fullPath = Path.GetFullPath(fileName);

Console.WriteLine("GetFullPath({0}) \n gibt\n{1}", fileName, fullPath);

string directoryName = Path.GetDirectoryName(fullPath);

Console.WriteLine("GetDirectoryName({0}) \n gibt\n{1}",

fullPath, directoryName);

. . .

}

}

10Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Angabe des

vollständigen

Pfads

Page 11: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Kopieren von Dateien

11Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 12: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Die C# Klasse File

� Stellt statische Methoden zum Erstellen, Kopieren, Löschen, Verschieben und Öffnen von Dateien bereit.

� Diese Methoden funktionieren für alle Plattformen gleich.

Einige Methoden der Klasse File sind

12Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Befehl Beschreibung

Create(file) Erzeugt eine neue Datei mit dem Verzeichnispfad file.

Open(file, mode) Öffnet eine Datei zum Lesen oder Schreiben.

Exists(file) Gibt true zurück, falls eine Datei mit dem Pfad file existiert.

Copy(file1, file2, true) Kopiert die Datei mit Pfad-Name file1 an die Stelle (Pfad-Name) file2. truezeigt an, dass eine ev. vorhandenes Datei file2 überschrieben wird.

Move(file1, file2) Verschiebt die Datei mit Pfad-Name file1 an die Stelle (Pfad-Name) file2. Wirft eine Exception, falls file2 bereits existiert.

AppendAllText(file1, text) Fügt den String text am Ende in die Datei file1 ein.

Delete(file) Löscht die Datei im Verzeichnispfad file (falls es existiert).

Page 13: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

using System;

using System.IO;

class Program

{

static void Main(string[] args)

{

string fileName1 = "C:\\tmp\\CSharp\\Test.txt";

string fileName2 = "C:\\tmp\\Test.txt";

string fileName3 = "C:\\tmp\\CSharp\\Test1.txt";

try

{

// File kopieren (existierende Files werden überschrieben)

File.Copy(fileName1, fileName2, true);

13Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Datei C:\tmp\Csharp\Text.txt wird zuerst

nach C:\tmp kopiert.

Page 14: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

// File verschieben

File.Move(fileName2, fileName3);

// Text anfügen

File.AppendAllText(fileName3, "Neuer Text");

// Datei löschen

File.Delete(fileName3);

}

catch (IOException e)

{

Console.WriteLine(e.Message);

// lösche Datei fileName3 (falls vorhanden)

if (File.Exists(fileName3))

{ File.Delete(fileName3); }

}

}

14Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Datei C:\tmp\Text.txt wird nach

C:\tmp\CSharp\Text1.txt verschoben,

um den String “Neuer Text” verlängert,

um am Ende wieder gelöscht.

Falls ein Fehler aufgetreten ist, soll die

Datei unter fileName3 gelöscht werden.

Page 15: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Lesen und Schreiben von Text Dateien

15Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 16: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Lesen von Text-Dateien

Am einfachsten werden Text-Dateien durch einen der beiden BefehleReadAllText(fileName);

oder ReadAllLines(fileName);

gelesen.

ReadAllText() gibt den ganzen Inhalt in einem String zurück.

ReadAllLines() hat als Resultat einen String-Array

16Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 17: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

using System;

using System.IO;

class Program

{

static void Main()

{

string fileName = "C:\\tmp\\CSharp\\Test.txt";

string text = File.ReadAllText(fileName);

Console.WriteLine("Der Inhalt von Test.txt: \n{0}", text);

string[] lines = File.ReadAllLines(fileName);

Console.WriteLine("Der Inhalt von Test.txt:");

for (int i = 0; i < lines.Length; i++ )

{

Console.WriteLine(i + ". " + lines[i]);

}

17Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Datei

C:\tmp\CSharp\Text.txt wird gelesen und in den

String text eingefügt.

Die Datei

C:\tmp\CSharp\Text.txt wird zeilenweise in den

String lines eingefügt.

Page 18: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

// Zeilenweise einlesen und auf die Console ausgeben.

System.IO.StreamReader reader = new System.IO.StreamReader(fileName);

while (reader.Peek() > -1)

{

Console.WriteLine(reader.ReadLine());

}

reader.Close();

}

}

18Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Datei

C:\tmp\CSharp\Text.txt wird zeilenweise

eingelesen und sofort ausgegeben

Page 19: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Die Ausgabe

Zuerst Einlesen und Ausgebendes ganzen Datei-Inhaltes,

dann ganzen Inhalt einlesen und zeilenweise (nummeriert)ausgeben,

zuletzt zeilenweise einlesenund ausgeben

19Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 20: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Schreiben von Text-Dateien

Am einfachsten werden Text-Dateien durch einen der beiden BefehleWriteAllText(fileName, text);

oder WriteAllLines(fileName, textArray);

geschrieben.

Beide Methoden erzeugen jeweils eine neue Datei.

WriteAllText() erzeugt eine neue Datei mit dem Inhalt des Textes.

WriteAllLines() erzeugt eine neue Datei und fügt zeilenweise den Inhalt des textArrays ein.

20Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 21: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Schreiben von Text-Dateien

Flexibler ist das Schreiben in eine Datei mit Hilfe eines StreamWriter. Dieser fügt nach und nach die gewünschten Zeilen in die Datei ein.

Erzeugt wird ein StreamWriter durch den Konstruktor:StreamWriter writer = new StreamWriter(fileName);

Das Einfügen von neuem Text geschieht durch den Befehlwriter.WriteLine(text);

Am Ende muss der StreamWriter geschlossen werden.writer.Close();

21Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 22: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

using System;

using System.IO;

class Program

{

static void Main()

{

string path = "C:\\tmp\\CSharp\\";

string text = "Dieses Beispiel zeigt auf, . . . .";

File.WriteAllText(path+"Test1.txt", text);

string[] lines = { "1. Zeile eins", "2. Zeile zwei", "3. Zeile drei" };

File.WriteAllLines(path + "Test2.txt", lines);

22Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

In die Datei

C:\tmp\CSharp\Text1.txt wirdder String text eingefügt.

In die Datei

C:\tmp\CSharp\Text2.txt werdendie drei String-Zeilen aus lines

eingefügt.

Page 23: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

// nur gewisse Zeilen schreiben

StreamWriter writer = new StreamWriter(path + "Test3.txt");

foreach (string line in lines)

{

if (!line.Contains("2"))

{ writer.WriteLine(line); }

}

writer.WriteLine("4. Zeile vier");

writer.Close();

writer.Dispose();

}

}

23Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Datei

C:\tmp\CSharp\Text3.txt werden die Zeilen 1 und 3, sowie eine

neue Zeile 4 eingefügt.

Page 24: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Die erzeugten Dateien

24Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

File.WriteAllText(path+"Test1.txt", text);

File.WriteAllLines(path+"Test2.txt", lines);

StreamWriter writer =

new StreamWriter(path+"Test3.txt");

foreach(string line in lines)

{

if (!line.Contains("2"))

{ writer.WriteLine(line); }

}

Page 25: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Lesen und Schreiben von Binär-Dateien

25Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Page 26: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Die C# Klasse BinaryWriter

� Schreibt primitive Typen binär in einen Stream

� Unterstützt das Schreiben von Zeichenfolgen in einer bestimmten Codierung (z. B. UTF-8, UTF-16 oder ASCII).

Einige Methoden der Klasse BinaryWriter sind

26Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Befehl Beschreibung

BinaryWriter(stream) Erzeugt einen Writer, welcher auf den angegebenen Stream (z.B. ein File) schreiben kann.

BinaryWriter(stream, encoding) Erzeugt einen Writer, welcher die entsprechenden Codierung benutzt.

Write(data) Schreibt den Wert data (von einem beliebigen C# Basistyp wie z.B. int, float, bool, char, …) in den Stream.

Flush() Leert den Puffer und schreibt alle anstehenden Daten in den Stream.

Close() Schliesst den Writer und den zugrundeliegenden Stream. Dies ist nötig, damit die Datei sauber abgeschlossen wird.

Page 27: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Die C# Klasse BinaryReader

� Liest primitive Datentypen als Binärwerte

� Je nach Encoding wird eine spezifische Codierung verwendet.

Einige Methoden der Klasse BinaryReaders sind:

27Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Befehl Beschreibung

BinaryReader(stream) Erzeugt einen Reader, welcher aus dem angegebenen Stream (z.B. ein File) lesen kann.

BinaryReader(stream, encoding) Erzeugt einen Reader, welcher die entsprechenden Codierung benutzt.

ReadChar() Liest aus dem unterliegenden Stream ein char-Zeichen

ReadInt16() Liest aus dem unterliegenden Stream einen Integer Wert

ReadInt32() Liest aus dem unterliegenden Stream eine long Zahl

ReadSingle() Liest aus dem unterliegenden Stream eine float Zahl

ReadDouble() Liest aus dem unterliegenden Stream einen double Wert

ReadBoolean() Liest aus dem unterliegenden Stream einen Boolean Wert

Close() Schliesst den Reader und den zugrundeliegenden Stream.

Page 28: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

using System;

using System.IO;

class BinaerSchreiben

{

const string fileName = "Schraube.dat";

static void Main()

{

BinaryWriter writer =

new BinaryWriter(File.Open(fileName, FileMode.OpenOrCreate));

for (int i = 1; i < 4; i++)

{

writer.Write(i * 15); // Schreiben einer int Zahl

writer.Write(3+i/2.0); // Schreiben einer double Zahl

writer.Write(true); // Schreiben eines bool Werts

}

writer.Close();

28Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

In die Datei Schraube.dat werden

neue Werte (int, double und boolen) eingefügt.

Am Ende muss der writer geschlossen werden, sonst ist die

Datei nicht wieder verwendbar!

Schraube.dat

Page 29: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Ein C# Beispiel

if (File.Exists(fileName))

{

BinaryReader reader =

new BinaryReader(File.Open(fileName, FileMode.Open));

while (reader.PeekChar() > -1)

{

int l = reader.ReadInt32(); // Lesen einer Int Zahl

double d = reader.ReadDouble(); // Lesen einer Doulbe Zahl

Boolean f = reader.ReadBoolean(); // Lesen eines Boolean Wert

Schraube schraube2 = new Schraube(l, d, f);

schraube2.Ausgabe();

}

reader.Close();

}

}

29Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die aus der Datai gelesenen Werte

haben einen C# Datentyp und können darum direkt

weiterverwendet werden.

Page 30: Lesen und Schreiben von Dateien - sws.bfh.chamrhein/Skripten/Info2/01.Dateien.pdf · Die Datei C:\tmp\Text.txt wird nach C:\tmp\CSharp\Text1.txt verschoben, um den String “Neuer

Die Klasse Schraube

public class Schraube

{

private int Laenge;

private double Dicke;

private Boolean Flachkopf;

public Schraube(int l, double d, Boolean f)

{

this.Laenge = l; this.Dicke = d; this.Flachkopf = f;

}

public void Ausgabe()

{

Console.WriteLine("Schraube: Länge: {0}mm, Dicke: {1}mm,

Flachkopf: {2}\n", Laenge, Dicke, Flachkopf);

}

}

30Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012