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.

.NET-Hilfe gesucht?

Du baust eine Desktop-Anwendung?

Ich entwickle seit über 17 Jahren professionell in VB.NET und C#. Von Dateidialogen bis zur kompletten WinForms-Anwendung kann ich helfen.

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.MyDocuments für Benutzerdokumente
  • Environment.SpecialFolder.Desktop fü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.

Projekt in Planung?

Brauchst du eine fertige WinForms-Anwendung?

Von Dateidialogen bis zur kompletten datengetriebenen Desktop-App: Ich entwerfe Software, die hält. Lass uns über dein Projekt sprechen.

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

EigenschaftStandardZweck
Filter(leer)Einträge im Dateityp-Dropdown
FilterIndex1Vorausgewä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
AddExtensionTrueEndung automatisch aus Filter anhängen
OverwritePromptTrueWarnung vor dem Überschreiben bestehender Dateien
Title„Speichern unter“Fenstertitel des Dialogs
ValidateNamesTrueUngü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.

Interessiert?

Erfahrenen .NET-Entwickler gesucht?

Ich übernehme dein Projekt, von Dateioperationen bis zur fertigen Desktop-Anwendung. Schreib mir einfach eine Nachricht.

FAQ

Wie öffne ich einen SaveFileDialog in VB.NET?

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.

Wie setze ich einen Standard-Dateinamen im SaveFileDialog?

Setze die FileName-Eigenschaft vor dem Aufruf von ShowDialog(). Beispiel: dlg.FileName = "bericht.csv". Der Benutzer kann den Namen im Dialog noch ändern.

Wie filtere ich Dateitypen im SaveFileDialog?

Setze die Filter-Eigenschaft mit dem Muster Beschreibung|*.endung. Für mehrere Typen trenne sie mit Pipes: "Text (*.txt)|*.txt|CSV (*.csv)|*.csv".

Speichert der SaveFileDialog die Datei selbst?

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.

Was ist der Unterschied zwischen SaveFileDialog und OpenFileDialog?

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Robert Skibbe
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst, und hilft unserem Team zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.