Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Erfahren Sie, wie Sie schnell eine Liste von Dateien und deren Eigenschaften aus einer Bibliothek sammeln und diese Eigenschaften in einer App verwenden.
Voraussetzungen
- Asynchrone Programmierung für WinUI-Apps Informationen zum Schreiben asynchroner Apps in C# finden Sie unter Aufrufen asynchroner APIs in C# oder Visual Basic. Informationen zum Schreiben asynchroner Apps in C++ finden Sie unter Asynchrone Programmierung in C++-.
- Zugriffsberechtigungen für Bibliotheken Der Code in diesen Beispielen erfordert die PicturesLibrary-Funktion, aber Ihr Dateispeicherort erfordert möglicherweise eine andere Funktion oder gar keine Funktion. Weitere Informationen finden Sie unter Dateizugriffsberechtigungen.
- Einfache Dateiaufzählung In diesem Beispiel wird QueryOptions verwendet, um einige erweiterte Enumerationseigenschaften festzulegen. Weitere Informationen zum Abrufen einer einfachen Liste von Dateien für ein kleineres Verzeichnis finden Sie unter "Aufzählen und Abfragen von Dateien und Ordnern".
Nutzung
Viele Apps müssen die Eigenschaften einer Gruppe von Dateien auflisten, müssen aber nicht immer direkt mit den Dateien interagieren. Beispielsweise öffnet eine Musik-App jeweils eine Datei, benötigt aber die Eigenschaften aller Dateien in einem Ordner, damit die App die Warteschlange für Songs anzeigen kann oder damit der Benutzer eine gültige Datei zur Wiedergabe auswählen kann.
Die Beispiele auf dieser Seite sollten nicht in Apps verwendet werden, die die Metadaten aller Dateien oder Apps ändern, die mit allen resultierenden StorageFiles interagieren, über das Lesen ihrer Eigenschaften hinaus. Weitere Informationen finden Sie unter "Aufzählen und Abfragen von Dateien und Ordnern ".
Aufzählen aller Bilder an einem Speicherort
In diesem Beispiel werden wir
- Erstellen Sie ein QueryOptions-Objekt , um anzugeben, dass die App die Dateien so schnell wie möglich aufzählen möchte.
- Abrufen von Dateieigenschaften durch seitenweises Laden von StorageFile-Objekten in die App. Durch das Einlagern der Dateien wird der Arbeitsspeicherverbrauch der App optimiert und die wahrgenommene Reaktionsfähigkeit verbessert.
Erstellen der Abfrage
Zum Erstellen der Abfrage verwenden wir ein QueryOptions-Objekt, um anzugeben, dass die App nur bestimmte Arten von Bilddateien aufzählt und dateien herausfiltert, die mit Windows Information Protection (System.Security.EncryptionOwners) geschützt sind.
Es ist wichtig, die Eigenschaften festzulegen, auf die die App mithilfe von QueryOptions.SetPropertyPrefetch zugreift. Wenn die App auf eine Eigenschaft zugreift, die nicht vorab geladen wurde, kann es zu erheblichen Leistungseinbußen kommen.
Das Festlegen von IndexerOption.OnlyUseIndexerAndOptimzeForIndexedProperties weist das System an, ergebnisse so schnell wie möglich zurückzugeben, aber nur die in SetPropertyPrefetch angegebenen Eigenschaften einzuschließen.
Seitennummerierung in den Ergebnissen
Benutzer haben möglicherweise Tausende oder Millionen von Dateien in ihrer Bildbibliothek, sodass das Aufrufen von GetFilesAsync ihren Computer überwältigen würde, da es eine StorageFile für jedes Bild erstellt. Dies kann gelöst werden, indem sie eine feste Anzahl von StorageFiles gleichzeitig erstellen, sie in der Benutzeroberfläche verarbeiten und dann den Speicher freigeben.
In unserem Beispiel verwenden wir "StorageFileQueryResult.GetFilesAsync(UInt32 StartIndex, UInt32 maxNumberOfItems)" , um jeweils nur 100 Dateien abzurufen. Die App verarbeitet dann die Dateien und ermöglicht dem Betriebssystem, diesen Speicher anschließend freizugeben. Diese Technik begrenzt den maximalen Arbeitsspeicher der App und stellt sicher, dass das System reaktionsfähig bleibt. Natürlich müssen Sie die Anzahl der für Ihr Szenario zurückgegebenen Dateien anpassen, aber um eine reaktionsfähige Erfahrung für alle Benutzer sicherzustellen, empfiehlt es sich, nicht mehr als 500 Dateien gleichzeitig abzurufen.
Beispiel
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);
}
Ergebnisse
Die resultierenden StorageFile-Dateien enthalten nur die angeforderten Eigenschaften, werden aber im Vergleich zu den anderen IndexerOptions um 10 Mal schneller zurückgegeben. Die App kann weiterhin den Zugriff auf Eigenschaften anfordern, die noch nicht in der Abfrage enthalten sind, aber es gibt eine Leistungseinbuße, um die Datei zu öffnen und diese Eigenschaften abzurufen.
Hinzufügen von Ordnern zu Bibliotheken
Apps können den Benutzer auffordern, den Speicherort mithilfe von StorageLibrary.RequestAddFolderAsync dem Index hinzuzufügen. Sobald der Speicherort enthalten ist, wird er automatisch indiziert, und Apps können diese Technik zum Aufzählen der Dateien verwenden.
Siehe auch
QueryOptions-API-Referenz
Aufzählen und Abfragen von Dateien und Ordnern
Dateizugriffsberechtigungen
Windows developer