File Storage und Zugriff mit xamarin. AndroidFile Storage and Access with Xamarin.Android

Eine häufige Voraussetzung für Android-Apps ist die – Bearbeitung von Dateien, die Bilder speichern, Dokumente herunterladen oder Daten exportieren, die gemeinsam mit anderen Programmen genutzt werden.A common requirement for Android apps is to manipulate files – saving pictures, downloading documents, or exporting data to share with other programs. Android (basiert auf Linux) unterstützt dies durch die Bereitstellung von Speicherplatz für den Dateispeicher.Android (which is based on Linux) supports this by providing space for file storage. Android gruppiert das Dateisystem in zwei verschiedene Speichertypen:Android groups the filesystem into two different types of storage:

  • Interner Speicher – dabei handelt es sich um einen Teil des Dateisystems, auf den nur von der Anwendung oder dem Betriebssystem zugegriffen werden kann.Internal Storage – this is a portion of the file system that can be accessed only by the application or the operating system.
  • Externer Speicher – Dies ist eine Partition für die Speicherung von Dateien, auf die von allen apps, dem Benutzer und möglicherweise anderen Geräten zugegriffen werden kann.External Storage – this is a partition for the storage of files that is accessible by all apps, the user, and possibly other devices. Auf einigen Geräten kann der externe Speicher wechselseitig erfolgen (z. b. eine SD-Karte).On some devices, external storage may be removable (such as an SD card).

Diese Gruppierungen sind nur konzeptionell und verweisen nicht notwendigerweise auf eine einzelne Partition oder ein einzelnes Verzeichnis auf dem Gerät.These groupings are conceptual only, and don't necessarily refer to a single partition or directory on the device. Ein Android-Gerät stellt immer eine Partition für den internen und externen Speicher bereit.An Android device will always provide partition for internal storage and external storage. Möglicherweise haben bestimmte Geräte mehrere Partitionen, die als externer Speicher betrachtet werden.It is possible that certain devices may have multiple partitions that are considered to be external storage. Unabhängig von der Partition sind die APIs zum Lesen, schreiben oder Erstellen von Dateien identisch.Regardless of the partition the APIs for reading, writing, or creating files is the same. Es gibt zwei Sätze von APIs, die eine xamarin. Android-Anwendung für den Dateizugriff verwenden kann:There are two sets of APIs that a Xamarin.Android application may use for file access:

  1. Die .NET-APIs (von Mono bereitgestellt und von xamarin. Android umschließt) Hierzu gehören die von xamarin. Essentialsbereitgestellten Dateisystem Hilfsprogramme. –The .NET APIs (provided by Mono and wrapped by Xamarin.Android) – These includes the file system helpers provided by Xamarin.Essentials. Die .NET-APIs bieten die beste plattformübergreifende Kompatibilität, und der Schwerpunkt dieses Handbuchs liegt auf diesen APIs.The .NET APIs provide the best cross-platform compatibility and as such the focus of this guide will be on these APIs.
  2. Die nativen Java-Datei Zugriffs-APIs (von Java bereitgestellt und von xamarin. Android umschließt) – Java stellt seine eigenen APIs zum Lesen und Schreiben von Dateien bereit.The native Java file access APIs (provided by Java and wrapped by Xamarin.Android) – Java provides its own APIs for reading and writing files. Dabei handelt es sich um eine vollständig akzeptable Alternative zu den .NET-APIs, die für Android spezifisch sind und für apps, die plattformübergreifend sein sollen, nicht geeignet sind.These are a completely acceptable alternative to the .NET APIs, but are specific to Android and are not suitable for apps that are intended to be cross-platform.

Das Lesen und Schreiben in Dateien ist nahezu identisch mit xamarin. Android, wie es bei jeder anderen .NET-Anwendung der Fall ist.Reading and writing to files is almost identical in Xamarin.Android as it is to any other .NET application. Die xamarin. Android-App bestimmt den Pfad zu der Datei, die bearbeitet wird, und verwendet dann die standardmäßige .net-Ausdrücke für den Dateizugriff.The Xamarin.Android app determines the path to the file that will be manipulated, then uses standard .NET idioms for file access. Da sich die tatsächlichen Pfade zum internen und externen Speicher von Gerät zu Gerät oder von Android-Version zu Android-Version unterscheiden können, empfiehlt es sich nicht, den Pfad zu den Dateien hart zu codieren.Because the actual paths to internal and external storage may vary from device to device or from Android version to Android version, it is not recommended to hard code the path to the files. Verwenden Sie stattdessen die xamarin. Android-APIs, um den Pfad zu den Dateien zu ermitteln.Instead, use the Xamarin.Android APIs to determine the path to files. Auf diese Weise werden in den .NET-APIs zum Lesen und Schreiben von Dateien die systemeigenen Android-APIs zur Verfügung gestellt, die bei der Ermittlung des Pfads zu Dateien im internen und externen Speicher helfen.That way, the .NET APIs for reading and writing files exposes the native Android APIs that will help with determining the path to files on internal and external storage.

Vor der Erörterung der mit dem Dateizugriff verbundenen APIs ist es wichtig, einige Details zu dem internen und externen Speicher zu verstehen.Before discussing the APIs involved with file access, it is important to understand some of the details surrounding internal and external storage. Dies wird im nächsten Abschnitt erläutert.This will be discussed in the next section.

Interner und externer SpeicherInternal vs external storage

Konzeptionell sind interner Speicher und externer Speicher sehr ähnlich – . Sie sind beide Orte, an denen eine xamarin. Android-App möglicherweise Dateien speichert.Conceptually, internal storage and external storage are very similar – they are both places at which a Xamarin.Android app may save files. Diese Ähnlichkeit kann für Entwickler verwirrend sein, die nicht mit Android vertraut sind, da es nicht klar ist, wann eine APP internen Speicher und externen Speicher verwenden soll.This similarity may be confusing for developers who are not familiar with Android as it is not clear when an app should use internal storage vs external storage.

Der interne Speicher bezieht sich auf den nicht flüchtigen Speicher, der von Android dem Betriebssystem, den API und den einzelnen apps zugewiesen wird.Internal storage refers to the non-volatile memory that Android allocates to the operating system, APKs, and for individual apps. Auf diesen Speicherplatz kann außer dem Betriebssystem oder den apps nicht zugegriffen werden.This space is not accessible except by the operating system or apps. Android weist der internen Speicher Partition für jede APP ein Verzeichnis zu.Android will allocate a directory in the internal storage partition for each app. Wenn die APP deinstalliert wird, werden alle Dateien, die im internen Speicher in diesem Verzeichnis aufbewahrt werden, ebenfalls gelöscht.When the app is uninstalled, all the files that are kept on internal storage in that directory will also be deleted. Interner Speicher eignet sich am besten für Dateien, die nur für die APP zugänglich sind und nicht für andere apps freigegeben werden oder nur sehr wenig Wert haben, wenn die APP deinstalliert wird.Internal storage is best suited for files that are only accessible to the app and that will not be shared with other apps or will have very little value once the app is uninstalled. Unter Android 6,0 oder höher werden Dateien im internen Speicher möglicherweise automatisch von Google mithilfe des Features " Automatische Sicherung" in Android 6,0gesichert.On Android 6.0 or higher, files on internal storage may be automatically backed up by Google using the Auto Backup feature in Android 6.0. Interner Speicher hat folgende Nachteile:Internal storage has the following disadvantages:

  • Dateien können nicht freigegeben werden.Files cannot be shared.
  • Dateien werden gelöscht, wenn die APP deinstalliert wird.Files will be deleted when the app is uninstalled.
  • Der verfügbare Speicherplatz auf dem internen Speicher ist möglicherweise eingeschränkt.The space available on internal storage maybe limited.

Externer Speicher bezieht sich auf Dateispeicher, bei dem es sich nicht um einen internen Speicher handelt, und auf den nicht exklusiv für eine APPExternal storage refers to file storage that is not internal storage and not exclusively accessible to an app. Der primäre Zweck von externem Speicher ist die Bereitstellung von Dateien, die für die gemeinsame Nutzung von apps verwendet werden sollen oder die zu groß für den internen Speicher sind.The primary purpose of external storage is to provide a place to put files that are meant to be shared between apps or that are too large to fit on the internal storage. Der Vorteil externer Speicherung besteht darin, dass Sie in der Regel viel mehr Speicherplatz für Dateien als für den internen Speicher hat.The advantage of external storage is that it typically has much more space for files than internal storage. Es ist jedoch nicht immer gewährleistet, dass externer Speicher auf einem Gerät vorhanden ist, und erfordert möglicherweise spezielle Berechtigungen für den Benutzer, um darauf zuzugreifen.However, external storage is not always guaranteed to be present on a device and may require special permission from the user to access it.

Hinweis

Bei Geräten, die mehrere Benutzer unterstützen, stellt Android jedem Benutzer ein eigenes Verzeichnis im internen und externen Speicher zur Verfügung.For devices that support multiple users, Android will provide each user their own directory on both internal and external storage. Auf dieses Verzeichnis kann von anderen Benutzern auf dem Gerät nicht zugegriffen werden.This directory is inaccessible to other users on the device. Diese Trennung ist für apps unsichtbar, solange Sie keine Pfade zu Dateien im internen oder externen Speicher hart codieren.This separation is invisible to apps as long as they do not hardcode paths to files on internal or external storage.

Als Faustregel gilt, dass xamarin. Android-Apps Ihre Dateien im internen Speicher speichern sollten, wenn dies angemessen ist, und sich auf externen Speicher verlassen müssen, wenn Dateien für andere apps freigegeben werden müssen, sehr groß sind oder beibehalten werden sollten, auch wenn die APP deinstalliert wird.As a rule of thumb, Xamarin.Android apps should prefer saving their files on internal storage when it is reasonable, and rely on external storage when files need to be shared with other apps, are very large, or should be retained even if the app is uninstalled. Eine Konfigurationsdatei eignet sich z. b. am besten für einen internen Speicher, da Sie keine Wichtigkeit hat, außer der APP, die Sie erstellt.For example, a configuration file is best suited for a internal storage as it has no importance except to the app that creates it. Im Gegensatz dazu sind Fotos ein guter Kandidat für die externe Speicherung.In contrast, photos are a good candidate for external storage. Sie können sehr groß sein, und in vielen Fällen kann der Benutzer Sie freigeben oder darauf zugreifen, auch wenn die APP deinstalliert wird.They can be very large and in many cases the user may want to share them or access them even if the app is uninstalled.

Dieser Leitfaden konzentriert sich auf den internen Speicher.This guide will focus on internal storage. Ausführliche Informationen zur Verwendung von externem Speicher in einer xamarin. Android-Anwendung finden Sie im Handbuch für externe Speicherung .Please see the guide External storage for details on using external storage in a Xamarin.Android application.

Arbeiten mit internem SpeicherWorking with internal storage

Das interne Speicher Verzeichnis für eine Anwendung wird vom Betriebssystem bestimmt und für Android-Apps durch die Android.Content.Context.FilesDir -Eigenschaft verfügbar gemacht.The internal storage directory for an application is determined by the operating system, and is exposed to Android apps by the Android.Content.Context.FilesDir property. Dadurch wird ein Java.IO.File -Objekt zurückgegeben, das das Verzeichnis darstellt, das von Android exklusiv für die APP zugewiesen wurde.This will return a Java.IO.File object representing the directory that Android has dedicated exclusively for the app. Beispielsweise kann eine APP mit dem Paketnamen com. CompanyName das interne Speicher Verzeichnis sein:For example, an app with the package name com.companyname the internal storage directory might be:

/data/user/0/com.companyname/files

In diesem Dokument wird das interne Speicher Verzeichnis als _interner_Speicher_bezeichnet.This document will refer to the internal storage directory as INTERNAL_STORAGE.

Wichtig

Der genaue Pfad zum internen Speicher Verzeichnis kann von Gerät zu Gerät und zwischen Android-Versionen variieren.The exact path to the internal storage directory can vary from device to device and between versions of Android. Aus diesem Grund dürfen apps den Pfad zum Speicher Verzeichnis der internen Dateien nicht hart codieren und stattdessen die xamarin. Android-APIs verwenden, z System.Environment.GetFolderPath(). b.Because of this, apps must not hard code the path to the internal files storage directory, and instead use the Xamarin.Android APIs, such as System.Environment.GetFolderPath().

Um die Code Freigabe zu maximieren, sollten xamarin. Android-Apps (oder xamarin. Forms-Apps für xamarin System.Environment.GetFolderPath() . Android) die-Methode verwenden.To maximize code sharing, Xamarin.Android apps (or Xamarin.Forms apps targeting Xamarin.Android) should use the System.Environment.GetFolderPath() method. In xamarin. Android gibt diese Methode eine Zeichenfolge für ein Verzeichnis zurück, das den gleichen Speicherort Android.Content.Context.FilesDirwie hat.In Xamarin.Android, this method will return a string for a directory that is the same location as Android.Content.Context.FilesDir. Diese Methode verwendet eine Enumeration, System.Environment.SpecialFolder, die verwendet wird, um einen Satz von enumerierten Konstanten zu identifizieren, die die Pfade spezieller Ordner darstellen, die vom Betriebssystem verwendet werden.This method takes an enum, System.Environment.SpecialFolder, which is used to identify a set of enumerated constants that represent the paths of special folders used by the operating system. Nicht alle System.Environment.SpecialFolder Werte werden einem gültigen Verzeichnis in xamarin. Android zugeordnet.Not all of the System.Environment.SpecialFolder values will map to a valid directory on Xamarin.Android. In der folgenden Tabelle wird beschrieben, welcher Pfad für einen bestimmten Wert von System.Environment.SpecialFoldererwartet werden kann:The following table describes what path can be expected for a given value of System.Environment.SpecialFolder:

System.Environment.SpecialFolderSystem.Environment.SpecialFolder PfadPath
ApplicationData Interner_Speicher/.configINTERNAL_STORAGE/.config
Desktop Interner_Speicher/DesktopINTERNAL_STORAGE/Desktop
LocalApplicationData Interner_Speicher/.local/shareINTERNAL_STORAGE/.local/share
MyDocuments INTERNER_SPEICHERINTERNAL_STORAGE
MyMusic Interner_Speicher/MusicINTERNAL_STORAGE/Music
MyPictures Interner_Speicher/PicturesINTERNAL_STORAGE/Pictures
MyVideos Interner_Speicher/VideosINTERNAL_STORAGE/Videos
Personal INTERNER_SPEICHERINTERNAL_STORAGE

Lesen oder schreiben in Dateien im internen SpeicherReading or Writing to files on internal storage

Jede der C# APIs zum Schreiben in eine Datei ist ausreichend. der Pfad zu der Datei, die sich in dem Verzeichnis befindet, das der Anwendung zugeordnet ist, muss lediglich angezeigt werden.Any of the C# APIs for writing to a file are sufficient; all that is necessary is to get the path to the file that is in the directory allocated to the application. Es wird dringend empfohlen, dass die asynchronen Versionen der .NET-APIs verwendet werden, um Probleme zu minimieren, die möglicherweise mit dem Dateizugriff verknüpft sind, der den Haupt Thread blockiert.It is strongly recommended that the async versions of the .NET APIs are used to minimize any issues that may be associate with file access blocking the main thread.

Dieser Code Ausschnitt ist ein Beispiel für das Schreiben einer Ganzzahl in eine UTF-8-Textdatei in das interne Speicher Verzeichnis einer Anwendung:This code snippet is one example of writing an integer to a UTF-8 text file to the internal storage directory of an application:

public async Task SaveCountAsync(int count)
{
    var backingFile = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "count.txt");
    using (var writer = File.CreateText(backingFile))
    {
        await writer.WriteLineAsync(count.ToString());
    }
}

Der nächste Code Ausschnitt bietet eine Möglichkeit, einen ganzzahligen Wert zu lesen, der in einer Textdatei gespeichert wurde:The next code snippet provides one way to read an integer value that was stored in a text file:

public async Task<int> ReadCountAsync()
{
    var backingFile = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "count.txt");

    if (backingFile == null || !File.Exists(backingFile))
    {
        return 0;
    }

    var count = 0;
    using (var reader = new StreamReader(backingFile, true))
    {
        string line;
        while ((line = await reader.ReadLineAsync()) != null)
        {
            if (int.TryParse(line, out var newcount))
            {
                count = newcount;
            }
        }
    }

    return count;
}

Verwenden von xamarin. – Essentials-Datei System HilfenUsing Xamarin.Essentials – File System Helpers

Xamarin. Essentials ist ein Satz von APIs zum Schreiben von plattformübergreifendes kompatiblem Code.Xamarin.Essentials is a set of APIs for writing cross-platform compatible code. Die Datei System -Hilfsprogramme sind eine-Klasse, die eine Reihe von Hilfsprogrammen enthält, um die Suche nach dem Cache und den Daten Verzeichnissen der Anwendung zu vereinfachen.The File System Helpers is a class that contains a series of helpers to simplify locating the application's cache and data directories. Dieser Code Ausschnitt enthält ein Beispiel für die Suche nach dem internen Speicher Verzeichnis und dem Cache Verzeichnis für eine APP:This code snippet provides an example of how to find the internal storage directory and the cache directory for an app:

// Get the path to a file on internal storage
var backingFile = Path.Combine(Xamarin.Essentials.FileSystem.AppDataDirectory, "count.txt");

// Get the path to a file in the cache directory
var cacheFile = Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory, "count.txt");

Ausblenden von Dateien aus demMediaStoreHiding files from the MediaStore

Bei MediaStore handelt es sich um eine Android-Komponente, die Metadaten zu Mediendateien (Videos, Musik, Bilder) auf einem Android-Gerät sammelt.The MediaStore is an Android component that collects meta data about media files (videos, music, images) on an Android device. Der Zweck besteht darin, die Freigabe dieser Dateien für alle Android-Apps auf dem Gerät zu vereinfachen.Its purpose is simplify the sharing of these files across all Android apps on the device.

Private Dateien werden nicht als Share Bare Medien angezeigt.Private files will not show up as shareable media. Wenn eine APP beispielsweise ein Bild in Ihrem privaten externen Speicher speichert, wird diese Datei nicht vom Medien Scanner (MediaStore) übernommen.For example, if an app saves a picture to its private external storage, then that file will not be picked up by the media scanner (MediaStore).

Öffentliche Dateien werden von MediaStoreübernommen.Public files will be picked up by MediaStore. Verzeichnisse mit einem Dateinamen, der 0 (null) ist . Nomedia wird nicht von MediaStoregescannt.Directories that have a zero byte file name .NOMEDIA will not be scanned by MediaStore.