Silverlight Snippet: Dateien speichern und laden

Seit Silverlight in der dritten Version erschienen ist, gibt es neben der Möglichkeit, vom Benutzer ausgewählte Dateien in die Silverlight-Anwendung zu laden auch eine Möglichkeit, Dateien lokal auf dem Rechner des Benutzers zu speichern. Die beiden dafür zuständige Klassen sind OpenFileDialog und SaveFileDialog, deren Verwendung ich hier kurz demonstrieren möchte.

Im XAML definieren wir folgendermaßen eine TextBox und einen Laden- sowie einen Speichern-Button, um geschriebene Textdateien in die TextBox zu laden oder als Datei abzuspeichern:

 <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <TextBox Grid.Row="0" Margin="16"
                 x:Name="textBox"
                 AcceptsReturn="True" />

        <StackPanel Grid.Row="1" Margin="16"
                    Orientation="Horizontal">
            <Button Content="Laden" Click="OnLoad" />
            <Button Content="Speichern" Click="OnSave"
                    Margin="16,0,0,0"/>
        </StackPanel>

    </Grid>

Im Code-Behind sehen die Event-Handler der Buttons wie folgt aus:

   private void OnLoad(object sender, RoutedEventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Textdatei (*.txt)|*.txt";
            bool? result = dialog.ShowDialog();

            if (result.HasValue && result.Value)
            {
                StreamReader reader = dialog.File.OpenText();
                textBox.Text = reader.ReadToEnd();
                reader.Close();
            }
        }

        private void OnSave(object sender, RoutedEventArgs e)
        {
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Filter = "Textdatei (*.txt)|*.txt";
            bool? result = dialog.ShowDialog();

            if (result.HasValue && result.Value)
            {
                StreamWriter writer = new StreamWriter(dialog.OpenFile());
                writer.Write(textBox.Text);
                writer.Close();
            }
        }

Um das Beispiel minimal zu halten, habe ich nur die Filter-Eigenschaft der beiden Dialoge belegt, die angibt, welche Art von Dateien gelesen und gespeichert werden können. Es ist hier auch möglich, beim Filter mehrere Dateiendungen anzugeben: „Textdateien (*.txt)|*.txt|JPEG-Bilder (*.jpg)|*.jpg“. Dabei ist jeweils die erste Angabe vor dem vertikale Strich die Beschreibung des Dateiformates, die man im Klartext im Dialog sieht, und die zweite Angabe die letztendlich erwartete Dateiendung.

Zudem hat der OpenFileDialog eine Multiselect-Eigenschaft, mit der man mehr als eine Datei auswählbar macht. Nach dem Öffnen wäre dann anstatt der File-Eigenschaft Files belegt, was die Liste der geöffneten Dateien enthält, die man beispielsweise in einer Schleife durchlaufen könnte.

Der Aufruf von ShowDialog() liefert einen besonderen Datentyp zurück: Einen Nullable<bool>. Dieser Datentyp kann durch bool? abgekürzt werden. Nullable ist eine Wrapper-Struktur, die es auch Wertetypen wie bool oder int erlaubt, wie Referenztypen den Wert null anzunehmen. Dessen HasValue-Eigenschaft fragt ab, ob ein (nicht null) Wert gesetzt wurde und Value enthält den eigentlichen bool-Wert. War der Rückgabewert von ShowDialog() ein bool mit dem Wert true, hat der User Dateien ausgewählt und wir können uns bei beiden Dialogen einen Stream auf die Datei(en) zurückgeben lassen. Wir bekommen je nach Wahl des Dialoges einen nur les- oder schreibbaren Stream.

Aus Sicherheitsgründen hat man in Silverlight nur auf den Namen der geöffneten Datei zugriff, nicht hingegen auf weitere Informationen wie den vollen Dateipfad auf dem lokalen Rechner.

Für die Verwendung von StreamReader und -Writer muss mit using der Namespace System.IO eingebunden werden. Ich werde hier nicht weiter auf die Verwendung von Streams eingehen. Interessierte können hier über ihre Verwendung nachlesen.

Kommentare

3 Nachrichten zu “Silverlight Snippet: Dateien speichern und laden”

  1. he63 on 28. Juli 2010 16:05

    Super Tutorial!

    Kleiner Tipp zu diesem Kapitel: noch hinweisen, dass System.IO eingebunden werden muss.

  2. Andrej on 28. Juli 2010 17:52

    Danke für den Hinweis, ich erwähne System.IO jetzt am Ende des Artikels.

  3. free websites on 16. Februar 2011 16:59

    Can I simply say what a aid to search out someone who really knows what theyre talking about on the internet. You definitely know the way to bring a problem to gentle and make it important. More individuals need to learn this and perceive this side of the story. I cant consider youre not more standard because you positively have the gift.