Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Zjistěte, jak rychle shromáždit seznam souborů a jejich vlastností z knihovny a používat tyto vlastnosti v aplikaci.
Předpoklady
- Asynchronní programování pro aplikace WinUI Dozvíte se, jak psát asynchronní aplikace v jazyce C#, viz Volání asynchronních rozhraní API v jazyce C# nebo Visual Basic. Informace o tom, jak psát asynchronní aplikace v jazyce C++, najdete v tématu asynchronní programování v jazyce C++.
- Přístupová oprávnění ke knihovnám Kód v těchto příkladech vyžaduje funkci PicturesLibrary, ale umístění souboru může vyžadovat jinou funkci nebo vůbec žádnou funkci. Další informace najdete v tématu Přístupová oprávnění k souborům.
- Jednoduchý výčet souborů Tento příklad používá QueryOptions k nastavení několika pokročilých vlastností výčtu. Další informace o získání jednoduchého seznamu souborů pro menší adresář najdete v tématu Výčet a dotazování souborů a složek.
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
Windows developer