Udostępnij za pośrednictwem


Obsługa plików w programie Xamarin.Forms

Obsługa Xamarin.Forms plików za pomocą polecenia można osiągnąć przy użyciu kodu w bibliotece .NET Standard lub przy użyciu zasobów osadzonych.

Omówienie

Xamarin.Forms kod działa na wielu platformach — każdy z nich ma własny system plików. Wcześniej oznaczało to, że odczytywanie i zapisywanie plików było najłatwiejsze przy użyciu natywnych interfejsów API plików na każdej platformie. Alternatywnie osadzone zasoby to prostsze rozwiązanie do dystrybuowania plików danych za pomocą aplikacji. Jednak w przypadku platformy .NET Standard 2.0 można współużytkować kod dostępu do plików w bibliotekach .NET Standard.

Aby uzyskać informacje na temat obsługi plików obrazów, zapoznaj się ze stroną Praca z obrazami .

Zapisywanie i ładowanie plików

Klasy System.IO mogą służyć do uzyskiwania dostępu do systemu plików na każdej platformie. Klasa File umożliwia tworzenie, usuwanie i odczytywanie plików, a Directory klasa umożliwia tworzenie, usuwanie lub wyliczanie zawartości katalogów. Można również użyć Stream podklas, które mogą zapewnić większy stopień kontroli nad operacjami plików (takimi jak kompresja lub wyszukiwanie pozycji w pliku).

Plik tekstowy można napisać przy użyciu File.WriteAllText metody :

File.WriteAllText(fileName, text);

Plik tekstowy można odczytać przy użyciu File.ReadAllText metody :

string text = File.ReadAllText(fileName);

Ponadto metoda określa, File.Exists czy określony plik istnieje:

bool doesExist = File.Exists(fileName);

Ścieżkę pliku na każdej platformie można określić z biblioteki .NET Standard przy użyciu wartości Environment.SpecialFolder wyliczenia jako pierwszego argumentu Environment.GetFolderPath metody. Można to następnie połączyć z nazwą pliku za pomocą Path.Combine metody :

string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "temp.txt");

Te operacje przedstawiono w przykładowej aplikacji, która zawiera stronę, która zapisuje i ładuje tekst:

Zapisywanie i ładowanie tekstu

Ładowanie plików osadzonych jako zasobów

Aby osadzić plik w zestawie .NET Standard , utwórz lub dodaj plik i upewnij się, że akcja kompilacji: EmbeddedResource.

GetManifestResourceStream służy do uzyskiwania dostępu do osadzonego pliku przy użyciu jego identyfikatora zasobu. Domyślnie identyfikator zasobu jest nazwą pliku poprzedzoną domyślną przestrzenią nazw projektu, w którą jest osadzony — w tym przypadku zestaw to WorkingWithFiles , a nazwa pliku jest LibTextResource.txt, więc identyfikator zasobu to WorkingWithFiles.LibTextResource.txt.

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoadResourceText)).Assembly;
Stream stream = assembly.GetManifestResourceStream("WorkingWithFiles.LibTextResource.txt");
string text = "";
using (var reader = new System.IO.StreamReader (stream))
{  
    text = reader.ReadToEnd ();
}

Zmienna text może następnie służyć do wyświetlania tekstu lub w inny sposób używać go w kodzie. Poniższy zrzut ekranu przedstawia tekst renderowany w kontrolce Label :

Plik tekstowy osadzony w standardowej bibliotece platformy .NET

Ładowanie i deserializacja kodu XML jest równie proste. Poniższy kod przedstawia plik XML ładowany i deserializowany z zasobu, a następnie powiązany z elementem do wyświetlania ListView . Plik XML zawiera tablicę Monkey obiektów (klasa jest zdefiniowana w przykładowym kodzie).

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoadResourceText)).Assembly;
Stream stream = assembly.GetManifestResourceStream("WorkingWithFiles.LibXmlResource.xml");
List<Monkey> monkeys;
using (var reader = new System.IO.StreamReader (stream)) {
    var serializer = new XmlSerializer(typeof(List<Monkey>));
    monkeys = (List<Monkey>)serializer.Deserialize(reader);
}
var listView = new ListView ();
listView.ItemsSource = monkeys;

Plik XML osadzony w standardowej bibliotece platformy .NET wyświetlany w widoku ListView

Osadzanie w projektach udostępnionych

Udostępnione projekty mogą również zawierać pliki jako zasoby osadzone, jednak ponieważ zawartość udostępnionego projektu jest kompilowana w projektach odwołująjących się, prefiks używany dla identyfikatorów zasobów plików osadzonych może ulec zmianie. Oznacza to, że identyfikator zasobu dla każdego pliku osadzonego może być inny dla każdej platformy.

Istnieją dwa rozwiązania tego problemu z udostępnionymi projektami:

  • Zsynchronizuj projekty — edytuj właściwości projektu dla każdej platformy, aby używać tej samej nazwy zestawu i domyślnej przestrzeni nazw. Ta wartość może być następnie "zakodowana na stałe" jako prefiks identyfikatorów osadzonych zasobów w projekcie udostępnionym.
  • #if dyrektywy kompilatora — użyj dyrektyw kompilatora, aby ustawić poprawny prefiks identyfikatora zasobu i użyć tej wartości do dynamicznego konstruowania poprawnego identyfikatora zasobu.

Poniżej przedstawiono kod ilustrujący drugą opcję. Dyrektywy kompilatora służą do wybierania zakodowanego na stałe prefiksu zasobu (który jest zwykle taki sam jak domyślna przestrzeń nazw dla projektu odwołującego się). Następnie zmienna resourcePrefix jest używana do tworzenia prawidłowego identyfikatora zasobu, łącząc go z osadzoną nazwą pliku zasobu.

#if __IOS__
var resourcePrefix = "WorkingWithFiles.iOS.";
#endif
#if __ANDROID__
var resourcePrefix = "WorkingWithFiles.Droid.";
#endif

Debug.WriteLine("Using this resource prefix: " + resourcePrefix);
// note that the prefix includes the trailing period '.' that is required
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(SharedPage)).Assembly;
Stream stream = assembly.GetManifestResourceStream
    (resourcePrefix + "SharedTextResource.txt");

Organizowanie zasobów

W powyższych przykładach przyjęto założenie, że plik jest osadzony w katalogu głównym projektu biblioteki .NET Standard. W takim przypadku identyfikator zasobu ma postać Namespace.Filename.Extension, na WorkingWithFiles.LibTextResource.txt przykład i WorkingWithFiles.iOS.SharedTextResource.txt.

Istnieje możliwość organizowania zasobów osadzonych w folderach. Gdy osadzony zasób zostanie umieszczony w folderze, nazwa folderu stanie się częścią identyfikatora zasobu (oddzielonego kropkami), aby format identyfikatora zasobu stał się przestrzenią nazw.Folder.Nazwa pliku.Extension. Umieszczenie plików używanych w przykładowej aplikacji w folderze MyFolder spowoduje, że odpowiednie identyfikatory WorkingWithFiles.MyFolder.LibTextResource.txt zasobów i WorkingWithFiles.iOS.MyFolder.SharedTextResource.txt.

Debugowanie osadzonych zasobów

Ponieważ czasami trudno jest zrozumieć, dlaczego określony zasób nie jest ładowany, do aplikacji można tymczasowo dodać następujący kod debugowania, aby ułatwić potwierdzenie prawidłowego skonfigurowania zasobów. Spowoduje to wyprowadzenie wszystkich znanych zasobów osadzonych w danym zestawie w okienku Błędy , aby ułatwić debugowanie problemów z ładowaniem zasobów.

using System.Reflection;
// ...
// use for debugging, not in released app code!
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(SharedPage)).Assembly;
foreach (var res in assembly.GetManifestResourceNames()) {
    System.Diagnostics.Debug.WriteLine("found resource: " + res);
}

Podsumowanie

W tym artykule przedstawiono kilka prostych operacji na plikach na potrzeby zapisywania i ładowania tekstu na urządzeniu oraz ładowania osadzonych zasobów. W przypadku platformy .NET Standard 2.0 można współużytkować kod dostępu do plików w bibliotekach .NET Standard.