VB.NET SaveFileDialog – Datei speichern mit Dialog (2026)
Der VB.NET SaveFileDialog lässt den Benutzer einen Dateinamen und Speicherort wählen, bevor deine Anwendung Daten auf die Festplatte schreibt. Er übernimmt Pfadauswahl, Dateitypfilter und Überschreib-Bestätigung in einem einzigen Control. Dieser Guide behandelt Einrichtung, Filter, Standardpfade, gängige Muster und die Integration mit dem eigentlichen Schreibvorgang.
Inhaltsverzeichnis
- 1 Was ist der SaveFileDialog?
- 2 Einfaches Beispiel
- 3 Dateitypfilter einrichten
- 4 Standardordner und Dateiname setzen
- 5 Überschreib-Bestätigung
- 6 Komplettes Beispiel: Textdatei speichern
- 7 Binärdateien speichern (Bilder, PDFs)
- 8 Mit StreamWriter speichern (große Dateien)
- 9 Alle wichtigen Eigenschaften im Überblick
- 10 Häufige Fehler
- 11 FAQ
- 12 Fazit
Was ist der SaveFileDialog?
Der SaveFileDialog ist ein WinForms-Control aus System.Windows.Forms. Beim Aufruf von ShowDialog() öffnet sich der Standard-Windows-Dialog „Speichern unter“. Der Benutzer wählt einen Ordner, gibt einen Dateinamen ein und klickt Speichern. Dein Code erhält dann den vollständigen Dateipfad über die Eigenschaft FileName.
Verwende ihn, wenn:
- Der Benutzer wählen soll, wo eine Datei gespeichert wird (Exporte, Berichte, Downloads)
- Du einen Dateitypfilter brauchst (z.B. nur .txt, .csv oder .pdf)
- Du eine eingebaute Überschreib-Bestätigung willst, ohne sie selbst zu programmieren
Einfaches Beispiel
Der einfachste SaveFileDialog mit einem einzelnen Dateityp:
Using dlg As New SaveFileDialog()
dlg.Filter = "Textdateien (*.txt)|*.txt"
dlg.Title = "Textdatei speichern"
If dlg.ShowDialog() = DialogResult.OK Then
File.WriteAllText(dlg.FileName, "Hallo Welt")
End If
End Using
Der Using-Block gibt den Dialog nach der Verwendung frei. ShowDialog() gibt DialogResult.OK zurück, wenn der Benutzer auf Speichern klickt, oder DialogResult.Cancel, wenn er den Dialog schließt. Prüfe immer das Ergebnis, bevor du schreibst.
Dateitypfilter einrichten
Die Filter-Eigenschaft steuert, welche Dateitypen im Dropdown erscheinen. Die Syntax ist Beschreibung|Muster, getrennt durch Pipes für mehrere Typen:
' Einzelner Filter dlg.Filter = "Textdateien (*.txt)|*.txt" ' Mehrere Filter dlg.Filter = "Textdateien (*.txt)|*.txt|CSV-Dateien (*.csv)|*.csv|Alle Dateien (*.*)|*.*" ' Zweiten Filter vorauswählen (1-basierter Index) dlg.FilterIndex = 2
Jeder Filtereintrag besteht aus zwei Teilen: dem Anzeigetext (z.B. „Textdateien (*.txt)“) und dem eigentlichen Muster (z.B. „*.txt“). FilterIndex ist 1-basiert, also wählt 2 den zweiten Eintrag aus.
Dateiendung automatisch anhängen
' Endung anhängen, wenn der Benutzer keine eingibt (Standard: True) dlg.AddExtension = True ' Standard-Endung setzen (ohne den Punkt) dlg.DefaultExt = "txt"
Mit AddExtension = True (Standard) hängt der Dialog „.txt“ an, wenn der Benutzer nur „bericht“ ohne Endung eingibt. Die Endung kommt aus dem ausgewählten Filter oder dem DefaultExt-Wert.
Standardordner und Dateiname setzen
Using dlg As New SaveFileDialog()
' Im Dokumente-Ordner des Benutzers starten
dlg.InitialDirectory = Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments)
' Dateiname vorausfüllen
dlg.FileName = "bericht-2026.csv"
dlg.Filter = "CSV-Dateien (*.csv)|*.csv"
If dlg.ShowDialog() = DialogResult.OK Then
File.WriteAllText(dlg.FileName, csvContent)
End If
End Using
InitialDirectory legt fest, wo der Dialog öffnet. Gängige Optionen:
Environment.SpecialFolder.MyDocumentsfür BenutzerdokumenteEnvironment.SpecialFolder.Desktopfür den Desktop- Den Application Path zum Speichern neben der Anwendung
Wenn du InitialDirectory nicht setzt, merkt sich der Dialog den zuletzt besuchten Ordner während der aktuellen Sitzung.
Überschreib-Bestätigung
' Warnung anzeigen, wenn die Datei bereits existiert (Standard: True) dlg.OverwritePrompt = True
Diese Option ist standardmäßig aktiviert. Wenn der Benutzer eine bestehende Datei auswählt, zeigt Windows einen Bestätigungsdialog. Das musst du nicht selbst programmieren.
Komplettes Beispiel: Textdatei speichern
Ein realistisches Beispiel, das eine mehrzeilige Textdatei mit Encoding-Unterstützung speichert, unter Verwendung von WriteAllText:
Imports System.IO
Imports System.Text
Private Sub BtnSpeichern_Click(sender As Object, e As EventArgs) Handles BtnSpeichern.Click
Using dlg As New SaveFileDialog()
dlg.Title = "Bericht speichern"
dlg.Filter = "Textdateien (*.txt)|*.txt|CSV-Dateien (*.csv)|*.csv"
dlg.InitialDirectory = Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments)
dlg.FileName = $"bericht-{DateTime.Now:yyyy-MM-dd}"
If dlg.ShowDialog() = DialogResult.OK Then
Dim content As String = BuildReport()
File.WriteAllText(dlg.FileName, content, Encoding.UTF8)
MessageBox.Show($"Gespeichert unter {dlg.FileName}",
"Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Using
End Sub
Gib beim Schreiben von Textdateien immer Encoding.UTF8 an. Ohne diese Angabe verwendet .NET das System-Standard-Encoding, was auf anderen Rechnern zu Problemen mit Sonderzeichen führen kann.
Binärdateien speichern (Bilder, PDFs)
Der SaveFileDialog funktioniert für binäre Inhalte genauso. Der einzige Unterschied ist die Schreibmethode:
' Bild speichern
Using dlg As New SaveFileDialog()
dlg.Filter = "PNG-Bilder (*.png)|*.png|JPEG-Bilder (*.jpg)|*.jpg"
dlg.FileName = "screenshot"
If dlg.ShowDialog() = DialogResult.OK Then
PictureBox1.Image.Save(dlg.FileName)
End If
End Using
' Byte-Array speichern (z.B. heruntergeladenes PDF)
Using dlg As New SaveFileDialog()
dlg.Filter = "PDF-Dateien (*.pdf)|*.pdf"
If dlg.ShowDialog() = DialogResult.OK Then
File.WriteAllBytes(dlg.FileName, pdfBytes)
End If
End Using
Mit StreamWriter speichern (große Dateien)
Für große Dateien oder zeilenweises Schreiben verwende einen StreamWriter mit dem Pfad aus dem Dialog:
Using dlg As New SaveFileDialog()
dlg.Filter = "CSV-Dateien (*.csv)|*.csv"
If dlg.ShowDialog() = DialogResult.OK Then
Using writer As New StreamWriter(dlg.FileName, False, Encoding.UTF8)
writer.WriteLine("Name,Email,Alter")
For Each contact In contacts
writer.WriteLine($"{contact.Name},{contact.Email},{contact.Age}")
Next
End Using
End If
End Using
Der StreamWriter-Ansatz ist speichereffizienter für große Datenmengen, weil er Zeile für Zeile schreibt, statt den gesamten String im Speicher aufzubauen. Für einen tieferen Einblick in Dateioperationen siehe den VB.NET Textdatei schreiben Guide.
Alle wichtigen Eigenschaften im Überblick
| Eigenschaft | Standard | Zweck |
|---|---|---|
Filter | (leer) | Einträge im Dateityp-Dropdown |
FilterIndex | 1 | Vorausgewählter Filter (1-basiert) |
FileName | (leer) | Vorausgefüllter Dateiname / gewählter Pfad nach dem Dialog |
InitialDirectory | (leer) | Startordner |
DefaultExt | (leer) | Endung, die angehängt wird, wenn der Benutzer keine eingibt |
AddExtension | True | Endung automatisch aus Filter anhängen |
OverwritePrompt | True | Warnung vor dem Überschreiben bestehender Dateien |
Title | „Speichern unter“ | Fenstertitel des Dialogs |
ValidateNames | True | Ungültige Dateinamenzeichen ablehnen |
Häufige Fehler
Schreiben ohne DialogResult zu prüfen
' SCHLECHT - schreibt in leeren Pfad, wenn der Benutzer abbricht
dlg.ShowDialog()
File.WriteAllText(dlg.FileName, content)
' GUT - Ergebnis zuerst prüfen
If dlg.ShowDialog() = DialogResult.OK Then
File.WriteAllText(dlg.FileName, content)
End If
Using-Block vergessen
Der SaveFileDialog hält unverwaltete Ressourcen (ein Windows-COM-Objekt). Ohne Using bleiben diese Ressourcen im Speicher, bis der Garbage Collector läuft. Wickle ihn immer in einen Using-Block ein.
Fehlerhafte Filter-Syntax
' SCHLECHT - fehlendes Muster nach dem Pipe dlg.Filter = "Textdateien|" ' SCHLECHT - Komma statt Pipe dlg.Filter = "Textdateien (*.txt), *.txt" ' GUT - korrekte Beschreibung|Muster-Syntax dlg.Filter = "Textdateien (*.txt)|*.txt"
Ein fehlerhafter Filter-String wirft zur Laufzeit eine ArgumentException. Das Muster ist immer Anzeigetext|*.endung, mit einem Pipe-Zeichen als Trenner.
FAQ
Erstelle einen New SaveFileDialog() in einem Using-Block, setze die Filter-Eigenschaft und rufe ShowDialog() auf. Prüfe, ob das Ergebnis DialogResult.OK ist, bevor du in dlg.FileName schreibst.
Setze die FileName-Eigenschaft vor dem Aufruf von ShowDialog(). Beispiel: dlg.FileName = "bericht.csv". Der Benutzer kann den Namen im Dialog noch ändern.
Setze die Filter-Eigenschaft mit dem Muster Beschreibung|*.endung. Für mehrere Typen trenne sie mit Pipes: "Text (*.txt)|*.txt|CSV (*.csv)|*.csv".
Nein. Der Dialog lässt den Benutzer nur einen Pfad und Dateinamen wählen. Du bist selbst dafür verantwortlich, die Datei zu schreiben, z.B. mit File.WriteAllText() oder File.WriteAllBytes() und dem Pfad aus dlg.FileName.
Der SaveFileDialog lässt den Benutzer ein Ziel für eine neue Datei wählen, mit eingebauter Überschreib-Bestätigung. Der OpenFileDialog lässt den Benutzer eine bestehende Datei zum Lesen auswählen. Beide geben den gewählten Pfad über die FileName-Eigenschaft zurück.
Fazit
Der SaveFileDialog gibt deiner VB.NET-Anwendung ein natives Datei-Speichern-Erlebnis mit minimalem Code. Setze einen Filter für Dateitypen, nutze InitialDirectory für den Startordner und prüfe immer DialogResult.OK bevor du schreibst. Für den eigentlichen Schreibvorgang verwende File.WriteAllText() für Text oder File.WriteAllBytes() für Binärdaten. Musst du stattdessen Dateien einlesen? Der OpenFileDialog funktioniert nach dem gleichen Muster in umgekehrter Richtung. Mehr zum Schreiben von Textdateien findest du im VB.NET Textdatei schreiben Guide.