Rychlý přístup k vlastnostem souboru ve WinUI

Zjistěte, jak rychle shromáždit seznam souborů a jejich vlastností z knihovny a používat tyto vlastnosti v aplikaci.  

Předpoklady

Použití

Mnoho aplikací musí vypsat vlastnosti skupiny souborů, ale nemusí s nimi vždy pracovat přímo. Například hudební aplikace přehraje jeden soubor najednou, ale potřebuje vlastnosti všech souborů ve složce, aby mohla zobrazit frontu skladeb, nebo aby uživatel mohl zvolit platný soubor k přehrání.

Příklady na této stránce by se neměly používat v aplikacích, které upraví metadata všech souborů nebo aplikací, které pracují se všemi výslednými soubory StorageFile nad rámec čtení jejich vlastností. Další informace najdete v tématu Výčet a dotazování souborů a složek

Vyjmenujte všechny obrázky v umístění

V tomto příkladu budeme

  • Vytvořte objekt QueryOptions , který určí, že aplikace chce vytvořit výčet souborů co nejrychleji.
  • Načtěte vlastnosti souborů stránkováním objektů StorageFile uvnitř aplikace. Načítání souborů do paměti snižuje zatížení paměti aplikace a zlepšuje vnímání rychlosti její odezvy.

Vytvoření dotazu

K sestavení dotazu použijeme objekt QueryOptions k určení, že aplikace má zájem o výčet pouze určitých typů souborů obrázků a k vyfiltrování souborů chráněných službou Windows Information Protection (System.Security.EncryptionOwners). 

Je důležité nastavit vlastnosti, ke které bude aplikace přistupovat pomocí QueryOptions.SetPropertyPrefetch. Pokud aplikace přistupuje k vlastnosti, která není předem získaná, dojde k významné penalizaci výkonu.

Nastavení IndexerOption.OnlyUseIndexerAndOptimzeForIndexedProperties systému řekne, aby co nejrychleji vrátil výsledky, ale zahrnout pouze vlastnosti zadané v SetPropertyPrefetch.

Stránkování ve výsledcích

Uživatelé můžou mít v knihovně obrázků tisíce nebo miliony souborů, takže volání GetFilesAsync by zahltilo svůj počítač, protože pro každou image vytvoří soubor Úložiště. To lze vyřešit vytvořením pevného počtu souborů úložiště najednou, jejich zpracováním do uživatelského rozhraní a uvolněním paměti. 

V našem příkladu to provedeme pomocí StorageFileQueryResult.GetFilesAsync(UInt32 StartIndex, UInt32 maxNumberOfItems) k načtení pouze 100 souborů najednou. Aplikace pak zpracuje soubory a umožní operačnímu systému uvolnit danou paměť později. Tato technika limituje maximální paměť aplikace a zajišťuje, aby systém zůstal responzivní. Samozřejmě budete muset upravit počet vrácených souborů pro váš scénář, ale abyste zajistili responzivní prostředí pro všechny uživatele, doporučujeme nenačítat více než 500 souborů najednou.

Příklad

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

Výsledky

Výsledné soubory StorageFile obsahují pouze požadované vlastnosti, ale v porovnání s ostatními indexerOptions se vrátí 10krát rychleji. Aplikace stále může požádat o přístup k vlastnostem, které ještě nejsou zahrnuty v dotazu, ale existuje snížení výkonu pro otevření souboru a načtení těchto vlastností.  

Přidávání složek do knihoven

Aplikace můžou požádat uživatele o přidání umístění do indexu pomocí StorageLibrary.RequestAddFolderAsync. Jakmile je umístění zahrnuté, automaticky se indexuje a aplikace můžou tuto techniku použít k vytvoření výčtu souborů.  

Viz také

Referenční informace k rozhraní API QueryOptions
Vytvoření výčtu a dotazování souborů a složek
Přístupová oprávnění k souborům