Silverlight - dostęp do plików

W tym rozdziale zobaczymy, jak aplikacje Silverlight mogą uzyskiwać dostęp do plików na komputerze użytkownika końcowego. Istnieją trzy główne sposoby uzyskiwania dostępu do plików w Silverlight. Wybór będzie zależał od powodu, dla którego chcesz używać plików, i od tego, czy piszesz zaufaną aplikację.

  • Najbardziej elastyczną opcją jest użycie rozszerzenia file dialogzajęcia. DziękiOpen i Savedialogów plików, możesz uzyskać dostęp do dowolnego pliku wybranego przez użytkownika końcowego, o ile ma on odpowiednie uprawnienia. Zgoda użytkownika ma kluczowe znaczenie dla tego podejścia. Użytkownik musi wybrać plik do odczytania lub podczas zapisywania wybiera plik do nadpisania lub wybiera lokalizację i nazwę pliku za Ciebie.

  • Drugą opcją jest użycie różnych klas w System.IOprzestrzeń nazw. Silverlight oferuje takie zajęcia jakFileStream, StreamWriter, FileInfo, Directory, i DirectoryInfo, z których wszystkie umożliwiają pisanie kodu, który otwiera i uzyskuje dostęp do plików bez konieczności angażowania użytkownika. Może to być wygodniejsze dla programisty, ale oczywiście większość użytkowników nie chciałaby, aby żaden stary kod pobrany jako część strony internetowej mógł przeszukiwać swoje pliki.

  • Trzecia opcja to Isolated Storage, które omówimy później.

Otwórz i zapisz okna dialogowe plików

SaveFileDialog

Plik SaveFileDialog class pokazuje standardowy interfejs użytkownika dostarczony przez system operacyjny do wyboru miejsca zapisania pliku.

Niektóre ważne funkcje to -

  • Aby z niego skorzystać, tworzymy wystąpienie SaveFileDialog klasa.

  • Powołanie ShowDialogpowoduje jego pojawienie się, a kod powrotu informuje nas, czy użytkownik wybrał miejsce do zapisania pliku, czy też anulował okno dialogowe.

  • Być może zastanawiasz się nad niepotrzebnym porównaniem z Truetam. GdybyShowDialog zwroty Truewartość, co oznacza, że ​​użytkownik wybrał plik. Więc możemy przejść do połączeniaOpenFile metoda, która zwraca nam plik Stream.

  • Jeśli chcemy, możemy odkryć nazwę, którą wybrał użytkownik. Okno dialogowe zawiera właściwość o nazwieSafeFileName, ale to nie obejmuje ścieżki. W każdym razie jedynym sposobem zapisania danych jest użycie rozszerzeniaStreamzwrócone przez okno dialogowe. Z punktu widzenia programisty jest to po prostu zwyczajne.NET stream, więc możemy zawinąć go w plik StreamWriter, aby wpisać do niego tekst.

OpenFileDialog

OpenFileDialog jest podobny w użyciu do SaveFileDialog. Oczywiście zawsze wybierasz istniejący plik zamiast nowego, ale jest jeszcze jedna ważna różnica.

  • Oferuje nieruchomość o nazwie MultiSelect. Jeśli ustawisz to naTrue, użytkownik może wybrać wiele plików. Oznacza to, że okno dialogowe wymaga nieco bardziej złożonego interfejsu API.

  • Plik SaveFileDialog zajmuje się tylko jednym plikiem naraz, ale OpenFileDialog jest w stanie poradzić sobie z większą liczbą, więc nie oferuje OpenFilemetoda. Musimy rozszerzyć kod. W zależności od tego, czy okno dialogowe jest włączonesingle file tryb lub MultiSelect tryb, możesz użyć jego Filelub Files własność.

  • Tutaj, w podanym poniżej przykładzie, jesteśmy w trybie pojedynczego pliku. Dlatego używamyFilei dzwonimy OpenRead na FileInfo obiekt, który zwraca.

  • W multiselect tryb, którego użylibyśmy Files zamiast tego zwraca kolekcję FileInfo obiekty.

FileStream

Drugie podejście do file access jak wspomniano powyżej, jest użycie FileStream lub pokrewne typy w System.IOprzestrzeń nazw bezpośrednio. Nie ma wiele do powiedzenia na ten temat, ponieważ w większości jest to podobne do dostępu do plików z pełnym.NET Framework.

Istnieje jednak kilka zwrotów akcji specyficznych dla Silverlight.

  • Po pierwsze, podejście to umożliwia dostęp do plików w dowolnym momencie bez interwencji użytkownika i bez widocznych widocznych oznak aktywności plików, tylko zaufane aplikacje mogą korzystać z tej techniki. Pamiętaj, że aby uzyskać podwyższone zaufanie, zabraknie przeglądarki.

  • Druga kwestia polega na tym, że dostępne są tylko pliki w określonych folderach. Możesz czytać i zapisywać tylko pliki, które są w formacieUser's Documents, Music, Pictures, or Video files. Jednym z powodów jest to, że Silverlight działa na wielu platformach, a struktura systemu plików, powiedzmy, Apple Mac, bardzo różni się od struktury systemu Windows. W związku z tym dostęp do plików między platformami musi działać w ramach ograniczonego zestawu folderów, które są dostępne we wszystkich systemach obsługiwanych przez Silverlight.

  • Ponieważ te foldery będą znajdować się w różnych lokalizacjach w różnych systemach operacyjnych, a ich lokalizacja będzie się zazwyczaj różnić w zależności od użytkownika, należy użyć Environment.GetFolderPath metoda, aby odkryć rzeczywistą lokalizację w czasie wykonywania.

  • Możesz sprawdzić strukturę katalogów poniżej punktów początkowych. PlikDirectory i DirectoryInfo zajęcia w System.IO przestrzeń nazw umożliwia wyliczanie plików i katalogów.

Rozważmy prosty przykład, w którym plik można otworzyć za pośrednictwem OpenFileDialog i zapisz tekst do pliku przez SaveFileDialog.

Poniżej podano kod XAML, w którym dwa przyciski i plik text box są tworzone.

<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>

Poniżej podano kod C # do implementacji zdarzeń kliknięcia, w którym plik jest otwierany i zapisywany.

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(); 
               } 
            } 
         }  
      } 
   } 
}

Gdy powyższy kod zostanie skompilowany i wykonany, zobaczysz następującą stronę internetową, która zawiera dwa przyciski.

Kliknij Open przycisk, który się otworzy OpenFileDialog aby wybrać plik tekstowy.

Wybierz plik tekstowy i kliknij Open, zobaczysz tekst w polu tekstowym.

Aby zapisać tekst w pliku, zaktualizuj tekst.

Kliknij Save aby zapisać zmiany w nowym pliku tekstowym lub w istniejącym pliku.

Aby zapisać zmiany w istniejącym pliku tekstowym, wybierz plik tekstowy w SaveFileDialog, ale jeśli chcesz zapisać zmiany w nowym pliku, wpisz nazwę pliku i kliknij Save przycisk.