Silverlight - Dateizugriff
In diesem Kapitel erfahren Sie, wie Silverlight-Anwendungen auf Dateien auf dem Computer des Endbenutzers zugreifen können. Es gibt drei Möglichkeiten, auf Dateien in Silverlight zuzugreifen. Die Auswahl hängt davon ab, warum Sie Dateien verwenden müssen und ob Sie eine vertrauenswürdige Anwendung schreiben.
Die flexibelste Option ist die Verwendung von file dialogKlassen. Mit demOpen und SaveIn Dateidialogen können Sie auf jede Datei zugreifen, die der Endbenutzer auswählt, sofern der Benutzer über die entsprechenden Berechtigungen verfügt. Die Zustimmung des Benutzers ist für diesen Ansatz von zentraler Bedeutung. Der Benutzer muss auswählen, welche Datei gelesen werden soll, oder beim Speichern eine Datei auswählen, die überschrieben werden soll, oder einen Speicherort und einen Dateinamen für Sie auswählen.
Die zweite Möglichkeit besteht darin, die verschiedenen Klassen in der zu verwenden System.IONamespace. Silverlight bietet Kurse wieFileStream, StreamWriter, FileInfo, Directory, und DirectoryInfoAll dies ermöglicht es, Code zu schreiben, der Dateien öffnet und darauf zugreift, ohne dass der Benutzer involviert werden muss. Das mag für den Entwickler bequemer sein, aber natürlich möchten die meisten Benutzer nicht, dass alter Code, der als Teil einer Webseite heruntergeladen wird, in ihren Dateien suchen kann.
Die dritte Option ist Isolated Storage, die wir später diskutieren werden.
Dialogfelder zum Öffnen und Speichern von Dateien
SaveFileDialog
Das SaveFileDialog Klasse zeigt die vom Standardbetriebssystem bereitgestellte Benutzeroberfläche für die Auswahl, wo eine Datei gespeichert werden soll.
Einige wichtige Merkmale sind -
Um es zu verwenden, erstellen wir eine Instanz von SaveFileDialog Klasse.
Berufung ShowDialog, bewirkt, dass es angezeigt wird, und der Rückkehrcode gibt an, ob der Benutzer einen Ort zum Speichern der Datei ausgewählt oder den Dialog abgebrochen hat.
Sie wundern sich vielleicht über den redundant aussehenden Vergleich mit TrueDort. WennShowDialog kehrt zurück TrueWert, was bedeutet, dass der Benutzer eine Datei ausgewählt hat. Also können wir weiter anrufenOpenFile Methode, die uns a zurückgibt Stream.
Wenn wir möchten, können wir den Namen ermitteln, den der Benutzer gewählt hat. Der Dialog bietet eine Eigenschaft namensSafeFileName, aber das schließt den Pfad nicht ein. In jedem Fall ist die einzige Möglichkeit, Daten zu schreiben, die Verwendung vonStreamvom Dialog zurückgegeben. Aus Entwicklersicht ist dies nur eine gewöhnliche Sache.NET stream, so können wir es in ein wickeln StreamWriter, um Text hinein zu schreiben.
OpenFileDialog
Der OpenFileDialog wird ähnlich wie der verwendet SaveFileDialog. Natürlich wählen Sie immer eine vorhandene Datei aus und keine neue, aber es gibt noch einen weiteren wichtigen Unterschied.
Es bietet eine Eigenschaft namens MultiSelect. Wenn Sie das einstellenTruekann der Benutzer mehrere Dateien auswählen. Dies bedeutet, dass der Dialog eine etwas komplexere API benötigt.
Das SaveFileDialog befasst sich jeweils nur mit einer Datei, aber OpenFileDialog ist in der Lage, mit mehr fertig zu werden, bietet also keine OpenFileMethode. Wir müssen den Code erweitern. Abhängig davon, ob der Dialog in istsingle file Modus oder MultiSelect Modus verwenden Sie entweder seine File, oder Files Eigentum.
Im folgenden Beispiel befinden wir uns im Einzeldateimodus. Daher verwenden wirFileund wir rufen an OpenRead auf der FileInfo Objekt, das zurückgibt.
Im multiselect Modus würden wir verwenden Files Stattdessen wird eine Sammlung von zurückgegeben FileInfo Objekte.
Datenfluss
Der zweite Ansatz zu file access wie oben erwähnt ist die zu verwenden FileStream Klasse oder verwandte Typen in der System.IONamespace direkt. Dazu gibt es nicht viel zu sagen, da es größtenteils dem Dateizugriff mit vollem Zugriff ähnelt.NET Framework.
Es gibt jedoch einige Silverlight-spezifische Wendungen.
Erstens können Sie mit diesem Ansatz jederzeit ohne Benutzereingriff auf Dateien zugreifen, und ohne erkennbare sichtbare Hinweise auf die Dateiaktivität dürfen nur vertrauenswürdige Anwendungen diese Technik verwenden. Denken Sie daran, dass Ihnen der Browser ausgehen muss, um ein erhöhtes Vertrauen zu erhalten.
Das zweite Problem ist, dass nur Dateien in bestimmten Ordnern verfügbar sind. Sie können nur Dateien lesen und schreiben, die sich unter dem befindenUser's Documents, Music, Pictures, or Video files. Ein Grund dafür ist, dass Silverlight auf mehreren Plattformen ausgeführt wird und sich die Dateisystemstruktur für beispielsweise einen Apple Mac stark von der von Windows unterscheidet. Daher muss der plattformübergreifende Dateizugriff in Bezug auf eine begrenzte Anzahl von Ordnern funktionieren, die auf allen von Silverlight unterstützten Systemen verfügbar sind.
Da sich diese Ordner auf verschiedenen Betriebssystemen an unterschiedlichen Speicherorten befinden und sich in der Regel von Benutzer zu Benutzer unterscheiden, müssen Sie den Ordner verwenden Environment.GetFolderPath Methode zum Ermitteln des tatsächlichen Speicherorts zur Laufzeit.
Sie können die Verzeichnisstruktur unter den Startpunkten überprüfen. DasDirectory und DirectoryInfo Klassen in der System.IO Mit dem Namespace können Sie Dateien und Verzeichnisse auflisten.
Stellen Sie sich ein einfaches Beispiel vor, in dem die Datei über geöffnet werden kann OpenFileDialog und speichern Sie Text in der Datei über SaveFileDialog.
Unten ist der XAML-Code angegeben, in dem zwei Schaltflächen und a text box erstellt werden.
<UserControl x:Class = "FileDialogs.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
<RowDefinition Height = "265*" />
</Grid.RowDefinitions>
<Button
x:Name = "saveFileButton"
Content = "Save"
Width = "75" FontSize = "20"
HorizontalAlignment = "Left" VerticalAlignment = "Top"
Margin = "12,12" Click = "saveFileButton_Click" />
<Button
x:Name = "openFileButton"
Content = "Open"
Width = "75" FontSize = "20"
HorizontalAlignment = "Left" VerticalAlignment = "Top"
Margin = "101,12,0,0" Click = "openFileButton_Click" />
<TextBox
x:Name = "contentTextBox"
Grid.Row = "1"
Margin = "12" FontSize = "20" />
</Grid>
</UserControl>
Im Folgenden ist der C # -Code für die Implementierung von Klickereignissen angegeben, in dem die Datei geöffnet und gespeichert wird.
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Controls;
namespace FileDialogs {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void saveFileButton_Click(object sender, RoutedEventArgs e) {
var save = new SaveFileDialog();
save.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
save.DefaultExt = ".txt";
if (save.ShowDialog() == true) {
Debug.WriteLine(save.SafeFileName);
using (Stream saveStream = save.OpenFile())
using (var w = new StreamWriter(saveStream)) {
var fs = saveStream as FileStream;
if (fs != null) {
w.Write(contentTextBox.Text);
}
}
}
}
private void openFileButton_Click(object sender, RoutedEventArgs e) {
var open = new OpenFileDialog();
if (open.ShowDialog() == true) {
using (Stream openStream = open.File.OpenRead()) {
using (var read = new StreamReader(openStream)) {
contentTextBox.Text = read.ReadToEnd();
}
}
}
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, wird die folgende Webseite angezeigt, die zwei Schaltflächen enthält.
Drücke den Open Schaltfläche, die geöffnet wird OpenFileDialog um eine Textdatei auszuwählen.
Wählen Sie eine Textdatei aus und klicken Sie auf Openwird der Text im Textfeld angezeigt.
Aktualisieren Sie den Text, um Text in der Datei zu speichern.
Drücke den Save Schaltfläche, um die Änderungen entweder in einer neuen Textdatei oder in einer vorhandenen Datei zu speichern.
Um Änderungen an der vorhandenen Textdatei zu speichern, wählen Sie die Textdatei in aus SaveFileDialogWenn Sie jedoch Änderungen an der neuen Datei speichern möchten, schreiben Sie den Dateinamen und klicken Sie auf Save Taste.