Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Obtenga información sobre cómo recopilar rápidamente una lista de archivos y sus propiedades de una biblioteca y usar esas propiedades en una aplicación.
Prerequisites
- Programación asincrónica para aplicaciones WinUI Puede aprender a escribir aplicaciones asincrónicas en C#, consulte Llamada a API asincrónicas en C# o Visual Basic. Para obtener información sobre cómo escribir aplicaciones asincrónicas en C++, consulte programación asincrónica en C++.
- Permisos de acceso a bibliotecas El código de estos ejemplos requiere la funcionalidad picturesLibrary, pero la ubicación del archivo puede requerir una funcionalidad diferente o ninguna funcionalidad. Para más información, consulte Permisos de acceso a archivos.
- Enumeración de archivos simple En este ejemplo se usa QueryOptions para establecer algunas propiedades de enumeración avanzadas. Para obtener más información sobre cómo obtener una lista sencilla de archivos para un directorio más pequeño, consulte Enumerar y consultar archivos y carpetas.
Uso
Muchas aplicaciones necesitan enumerar las propiedades de un grupo de archivos, pero no siempre necesitan interactuar con los archivos directamente. Por ejemplo, una aplicación de música reproduce (abre) un archivo cada vez, pero necesita las propiedades de todos los archivos de una carpeta para que la aplicación pueda mostrar la cola de canciones, o para que el usuario pueda elegir un archivo válido para reproducir.
Los ejemplos de esta página no deben usarse en aplicaciones que modifiquen los metadatos de cada archivo o aplicaciones que interactúen con todos los Archivos de almacenamiento resultantes más allá de leer sus propiedades. Consulte Enumerar y consultar archivos y carpetas para obtener más información.
Enumerar todas las imágenes de una ubicación
En este ejemplo, vamos a
- Cree un objeto QueryOptions para especificar que la aplicación quiere enumerar los archivos lo antes posible.
- Obtener las propiedades del archivo paginando objetos de StorageFile dentro de la aplicación. La paginación de los archivos reduce la memoria usada por la aplicación y mejora la capacidad de respuesta percibida de la aplicación.
Creación de la consulta
Para compilar la consulta, usamos un objeto QueryOptions para especificar que la aplicación está interesada en enumerar solo determinados tipos de archivos de imágenes y filtrar los archivos protegidos con Windows Information Protection (System.Security.EncryptionOwners).
Es importante establecer las propiedades a las que la aplicación va a acceder mediante QueryOptions.SetPropertyPrefetch. Si la aplicación accede a una propiedad que no está capturada previamente, incurrirá en una penalización de rendimiento significativa.
Establecer IndexerOption.OnlyUseIndexerAndOptimzeForIndexedProperties indica al sistema que devuelva los resultados lo antes posible, pero para incluir solo las propiedades especificadas en SetPropertyPrefetch.
Paginación en los resultados
Los usuarios pueden tener miles o millones de archivos en su biblioteca de imágenes, por lo que llamar a GetFilesAsync sobrecargaría su máquina porque crea un StorageFile para cada imagen. Esto se puede resolver mediante la creación de un número fijo de Archivos de almacenamiento a la vez, su procesamiento en la interfaz de usuario y, a continuación, la liberación de la memoria.
En nuestro ejemplo, lo hacemos mediante StorageFileQueryResult.GetFilesAsync(UInt32 StartIndex, UInt32 maxNumberOfItems) para capturar solo 100 archivos a la vez. A continuación, la aplicación procesará los archivos y permitirá que el sistema operativo libere esa memoria después. Esta técnica limita la memoria máxima de la aplicación y garantiza que el sistema siga respondiendo. Por supuesto, tendrá que ajustar el número de archivos devueltos para su escenario, pero para garantizar una experiencia con capacidad de respuesta para todos los usuarios, se recomienda no capturar más de 500 archivos a la vez.
Ejemplo
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);
}
Resultados
Los archivos StorageFile resultantes solo contienen las propiedades solicitadas, pero se devuelven 10 veces más rápido en comparación con el otro IndexerOptions. La aplicación todavía puede solicitar acceso a las propiedades que aún no están incluidas en la consulta, pero hay una penalización de rendimiento para abrir el archivo y recuperar esas propiedades.
Agregar carpetas a bibliotecas
Las aplicaciones pueden solicitar al usuario que agregue la ubicación al índice mediante StorageLibrary.RequestAddFolderAsync. Una vez incluida la ubicación, se indexará automáticamente y las aplicaciones pueden usar esta técnica para enumerar los archivos.
Consulte también
Referencia de la API QueryOptions
Enumerar y consultar archivos y carpetas
Permisos de acceso a archivos