Schneller Zugriff auf Dateieigenschaften in UWPFast access to file properties in UWP 

Hier erfährst du, wie du schnell eine Liste von Dateien und ihren Eigenschaften aus einer Bibliothek zusammenstellen und diese Eigenschaften in einer App verwenden kannst.Learn how to quickly gather a list of files and their properties from a library and use those properties in an app.  

VoraussetzungenPrerequisites 

  • Asynchrone Programmierung für UWP-Apps (Universelle Windows-Plattform):  Informationen zum Schreiben von asynchronen Apps in C# oder Visual Basic findest du unter Aufrufen asynchroner APIs in C# oder Visual Basic.Asynchronous programming for Universal Windows Platform (UWP) apps   You can learn how to write asynchronous apps in C# or Visual Basic, see Call asynchronous APIs in C# or Visual Basic. Informationen zum Schreiben von asynchronen Apps in C++ finden Sie unter Asynchrone Programmierung in C++.To learn how to write asynchronous apps in C++, see Asynchronous programming in C++. 
  • Zugriffsberechtigungen für Bibliotheken:  Der Code in diesen Beispielen erfordert beispielsweise den Zugriff auf die picturesLibrary-Funktion, während dein Dateispeicherort einen anderen Zugriffstyp oder keinen Zugriff voraussetzt.Access permissions to Libraries   The code in these examples requires the picturesLibrary capability, but your file location may require a different capability, or no capability at all. Weitere Informationen finden Sie unter Berechtigungen für den Dateizugriff.To learn more, see File access permissions. 
  • Einfache Dateiauflistung:   In diesem Beispiel werden mit QueryOptions einige erweiterte Auflistungseigenschaften festgelegt.Simple file enumeration    This example uses QueryOptions to set a few advanced enumeration properties. Weitere Informationen dazu, wie du eine einfache Liste von Dateien für ein kleineres Verzeichnis erhältst, findest du unter Aufzählen und Abfragen von Dateien und Ordnern.To learn more about just getting a simple list of files for a smaller directory, see Enumerate and query files and folders. 

UsageUsage  

Viele Apps müssen die Eigenschaften einer Gruppe von Dateien auflisten, müssen aber nicht immer direkt mit den Dateien interagieren.Many apps need to list the properties of a group of files, but don't always need to interact with the files directly. Beispiel: Eine Musik-App spielt (öffnet) immer nur eine Datei ab, sie benötigt aber die Eigenschaften aller Dateien in einem Ordner, damit sie die Songwarteschlange anzeigen oder damit der Benutzer eine gültige Datei für die Wiedergabe auswählen kann.For example, a music app plays (opens) one file at a time, but it needs the properties of all of the files in a folder so the app can show the song queue, or so the user can choose a valid file to play.

Die Beispiele auf dieser Seite sollten nicht in Apps verwendet werden, die die Metadaten jeder Datei modifizieren, oder in Apps, die mit allen resultierenden StorageFiles interagieren (über das Lesen ihrer Eigenschaften hinaus).The examples on this page shouldn't be used in apps that will modify the metadata of every file or apps that interact with all the resulting StorageFiles beyond reading their properties. Weitere Informationen findest du unter Aufzählen und Abfragen von Dateien und Ordnern.See Enumerate and query files and folders for more information. 

Aufzählen aller Bilder an einem SpeicherortEnumerate all the pictures in a location 

In diesem Beispiel werden die folgenden Schritte ausgeführt:In this example, we will

  • Erstellen eines QueryOptions-Objekts, um anzugeben, dass die App die Dateien so schnell wie möglich auflisten sollBuild a QueryOptions object to specify that the app wants to enumerate the files as quickly as possible.
  • Abrufen von Dateieigenschaften durch Auslagern von StorageFile-Objekten in die App.Fetch file properties by paging StorageFile objects into the app. Durch das Auslagern der Dateien wird der von der App belegte Arbeitsspeicher reduziert und die Reaktion verbessert.Paging the files in reduces the memory used by the app and improves its perceived responsiveness.

Erstellen der AbfrageCreating the query 

Zum Erstellen der Abfrage verwenden wir ein QueryOptions-Objekt, um anzugeben, dass die App nur an der Auflistung bestimmter Bilddateitypen interessiert ist, und um Dateien herauszufiltern, die mit Windows Information Protection (System.Security.EncryptionOwners) geschützt sind.To build the query, we use a QueryOptions object to specify that the app is interested in enumerating only certain types of images files and to filter out files protected with Windows Information Protection (System.Security.EncryptionOwners). 

Es ist wichtig, mit QueryOptions.SetPropertyPrefetch die Eigenschaften festzulegen, auf die die App zugreifen wird.It is important to set the properties the app is going to access using QueryOptions.SetPropertyPrefetch. Wenn die App auf eine Eigenschaft zugreift, die nicht vorab abgerufen wird, führt dies zu erheblichen Leistungseinbußen.If the app accesses a property that isn’t prefetched, it will incur a significant performance penalty.

OnlyUseIndexerAndOptimzeForIndexedProperties weist das System an, die Ergebnisse so schnell wie möglich zurückzugeben, aber nur die in SetPropertyPrefetch angegebenen Eigenschaften zu berücksichtigen.Setting IndexerOption.OnlyUseIndexerAndOptimzeForIndexedProperties tells the system to return results as quickly as possible, but to only include the properties specified in SetPropertyPrefetch.

Auslagern in den ErgebnissenPaging in the results 

Die Bilderbibliothek von Benutzern kann Tausende oder Millionen von Dateien enthalten. Der Aufruf von GetFilesAsync würde daher ihren Rechner überfordern, da für jedes Bild ein StorageFile-Objekt erstellt wird.Users may have thousands or millions of files in their pictures library, so calling GetFilesAsync would overwhelm their machine because it creates a StorageFile for each image. Dieses Problem kann dadurch behoben werden, dass eine feste Anzahl von StorageFiles-Elementen auf einmal erstellt wird, diese im Kontext der Benutzeroberfläche verarbeitet werden und der Arbeitsspeicher freigegeben wird.This can be solved by creating a fixed number of StorageFiles at one time, processing them into the UI, and then releasing the memory. 

In unserem Beispiel verwenden wir dazu StorageFileQueryResult.GetFilesAsync(UInt32 StartIndex, UInt32 maxNumberOfItems), um jeweils nur 100 Dateien gleichzeitig abzurufen.In our example, we do this by using StorageFileQueryResult.GetFilesAsync(UInt32 StartIndex, UInt32 maxNumberOfItems) to only fetch 100 files at a time. Die App verarbeitet dann die Dateien und erlaubt dem Betriebssystem, den Arbeitsspeicher anschließend wieder freizugeben.The app will then process the files and allow the OS to release that memory afterwards. Mit dieser Methode kann der von der App verwendete maximale Arbeitsspeicher begrenzt und sichergestellt werden, dass das System reaktionsschnell bleibt.This technique caps the maximum memory of the app and ensures the system stays responsive. Natürlich musst du die Anzahl der zurückgesendeten Dateien für dein Szenario anpassen. Aber um eine schnelle Reaktionszeit für alle Benutzer zu gewährleisten, ist es empfehlenswert, nicht mehr als 500 Dateien auf einmal abzurufen.Of course, you will need to adjust the number of files returned for your scenario, but to ensure a responsive experience for all users, it's recommended to not fetch more than 500 files at one time.

BeispielExample  

StorageFolder folderToEnumerate = KnownFolders.PicturesLibrary; 
// Check if the folder is indexed before doing anything. 
IndexedState folderIndexedState = await folderToEnumerate.GetIndexedStateAsync(); 
if (folderIndexedState == IndexedState.NotIndexed || folderIndexedState == IndexedState.Unknown) 
{ 
    // Only possible in indexed directories.  
    return; 
} 
 
QueryOptions picturesQuery = new QueryOptions() 
{ 
    FolderDepth = FolderDepth.Deep, 
    // Filter out all files that have WIP enabled
    ApplicationSearchFilter = "System.Security.EncryptionOwners:[]", 
    IndexerOption = IndexerOption.OnlyUseIndexerAndOptimizeForIndexedProperties 
}; 

picturesQuery.FileTypeFilter.Add(".jpg"); 
string[] otherProperties = new string[] 
{ 
    SystemProperties.GPS.LatitudeDecimal, 
    SystemProperties.GPS.LongitudeDecimal 
}; 
 
picturesQuery.SetPropertyPrefetch(PropertyPrefetchOptions.BasicProperties | PropertyPrefetchOptions.ImageProperties, 
                                    otherProperties); 
SortEntry sortOrder = new SortEntry() 
{ 
    AscendingOrder = true, 
    PropertyName = "System.FileName" // FileName property is used as an example. Any property can be used here.  
}; 
picturesQuery.SortOrder.Add(sortOrder); 
 
// Create the query and get the results 
uint index = 0; 
const uint stepSize = 100; 
if (!folderToEnumerate.AreQueryOptionsSupported(picturesQuery)) 
{ 
    log("Querying for a sort order is not supported in this location"); 
    picturesQuery.SortOrder.Clear(); 
} 
StorageFileQueryResult queryResult = folderToEnumerate.CreateFileQueryWithOptions(picturesQuery); 
IReadOnlyList<StorageFile> images = await queryResult.GetFilesAsync(index, stepSize); 
while (images.Count != 0 || index < 10000) 
{ 
    foreach (StorageFile file in images) 
    { 
        // With the OnlyUseIndexerAndOptimizeForIndexedProperties set, this won't  
        // be async. It will run synchronously. 
        var imageProps = await file.Properties.GetImagePropertiesAsync(); 
 
        // Build the UI 
        log(String.Format("{0} at {1}, {2}", 
                    file.Path, 
                    imageProps.Latitude, 
                    imageProps.Longitude)); 
    } 
    index += stepSize; 
    images = await queryResult.GetFilesAsync(index, stepSize); 
} 

ErgebnisseResults 

Die resultierenden StorageFile-Dateien enthalten nur die angeforderten Eigenschaften, werden aber zehnmal schneller zurückgegeben als die anderen IndexerOptions-Elemente.The resulting StorageFile files only contain the properties requested, but are returned 10 times faster compared to the other IndexerOptions. Die App kann weiterhin Zugriff auf Eigenschaften anfordern, die nicht bereits in der Abfrage enthalten sind. Dies führt beim Öffnen der Datei und Abrufen dieser Eigenschaften jedoch zu Leistungseinbußen. The app can still request access to properties not already included in the query, but there is a performance penalty to open the file and retrieve those properties.  

Hinzufügen von Ordnern zu BibliothekenAdding folders to Libraries 

Apps können den Benutzer mittels StorageLibrary.RequestAddFolderAsync auffordern, den Speicherort zum Index hinzuzufügen.Apps can request the user to add the location to the index using StorageLibrary.RequestAddFolderAsync. Ist der Speicherort erst einmal enthalten, wird er automatisch indiziert, und Apps können diese Technik zum Auflisten der Dateien verwenden.Once the location is included, it will be automatically indexed and apps can use this technique to enumerate the files.  

Siehe auchSee also

QueryOptions-API-ReferenzQueryOptions API Reference
Aufzählen und Abfragen von Dateien und OrdnernEnumerate and query files and folders
Berechtigungen für den DateizugriffFile access permissions