Acceso rápido a las propiedades de archivos de UWPFast access to file properties in UWP 

Aprenda rápidamente a recopilar una lista de archivos y sus propiedades de una biblioteca y use esas propiedades en una aplicación.Learn how to quickly gather a list of files and their properties from a library and use those properties in an app.  

Requisitos previosPrerequisites 

  • Programación asincrónica para aplicaciones para la Plataforma universal de Windows (UWP)  Para aprender a escribir aplicaciones asincrónicas en C# o Visual Basic, consulta Llamar a API asincrónicas en C# o 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. Para aprender a escribir aplicaciones asincrónicas en C++, consulta Programación asincrónica en C++.To learn how to write asynchronous apps in C++, see Asynchronous programming in C++. 
  • Permisos de acceso a bibliotecas   El código en estos ejemplos requiere la funcionalidad picturesLibrary, pero es posible que la ubicación de su archivo requiera otra funcionalidad o que no requiera ninguna.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. Para más información, consulta Permisos de acceso de archivos.To learn more, see File access permissions. 
  • Enumeración de archivo sencilla    Este ejemplo usa QueryOptions para establecer algunas propiedades avanzadas de enumeración.Simple file enumeration    This example uses QueryOptions to set a few advanced enumeration properties. Para obtener más información sobre cómo obtener una simple lista de archivos para un directorio más pequeño, consulte Enumerar y consultar archivos y carpetas.To learn more about just getting a simple list of files for a smaller directory, see Enumerate and query files and folders. 

UsoUsage  

Muchas aplicaciones necesitan enumerar las propiedades de un grupo de archivos, pero no siempre es necesario interactuar directamente con los archivos.Many apps need to list the properties of a group of files, but don't always need to interact with the files directly. Por ejemplo, un aplicación de música reproduce (o abre) un archivo a la vez, pero necesita las propiedades de todos los archivos en una carpeta para que la aplicación pueda mostrar la cola de canciones o el usuario pueda elegir un archivo válido para reproducirlo.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.

Los ejemplos de esta página no deben usarse en aplicaciones que modifican los metadatos de todos los archivos o aplicaciones que interactúan con todos los StorageFiles resultantes más allá de leer sus propiedades.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. Consulte Enumerar y consultar archivos y carpetas para obtener más información.See Enumerate and query files and folders for more information. 

Enumerar todas las imágenes en una ubicaciónEnumerate all the pictures in a location 

En este ejemplo, realizaremos lo siguiente:In this example, we will

  • Crearemos un objeto de QueryOptions para especificar que la aplicación quiera enumerar los archivos tan rápido como sea posible.Build a QueryOptions object to specify that the app wants to enumerate the files as quickly as possible.
  • Recuperaremos propiedades de archivo mediante la paginación de objetos de StorageFile en la aplicación.Fetch file properties by paging StorageFile objects into the app. La paginación de archivos reduce la cantidad de memoria usada por la aplicación y mejora la capacidad de respuesta percibida.Paging the files in reduces the memory used by the app and improves its perceived responsiveness.

Creación de la consultaCreating the query 

Para crear la consulta, usamos un objeto de QueryOptions para especificar que la aplicación está interesada en enumerar solo determinados tipos de archivos de imágenes y para filtrar los archivos protegidos con Windows Information Protection (System.Security.EncryptionOwners).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 importante establecer las propiedades a las que la aplicación tendrá acceso usando QueryOptions.SetPropertyPrefetch.It is important to set the properties the app is going to access using QueryOptions.SetPropertyPrefetch. Si la aplicación accede a una propiedad no capturada previamente, esto provocará una importante penalización de rendimiento.If the app accesses a property that isn’t prefetched, it will incur a significant performance penalty.

La configuración IndexerOption.OnlyUseIndexerAndOptimzeForIndexedProperties indica al sistema que devuelva los resultados lo más rápido posible, pero solo para incluir las propiedades especificadas en SetPropertyPrefetch.Setting IndexerOption.OnlyUseIndexerAndOptimzeForIndexedProperties tells the system to return results as quickly as possible, but to only include the properties specified in SetPropertyPrefetch.

Paginación en los resultadosPaging in the results 

Los usuarios pueden tener miles o millones de archivos en su biblioteca de imágenes, por lo tanto, una llamada a GetFilesAsync podría saturar su equipo porque se creará un StorageFile por cada imagen.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. Esto puede resolverse al crear un número fijo de StorageFiles a la vez, procesarlos en la interfaz de usuario y, a continuación, liberando la memoria.This can be solved by creating a fixed number of StorageFiles at one time, processing them into the UI, and then releasing the memory. 

En nuestro ejemplo, hacemos esto usando torageFileQueryResult.GetFilesAsync(UInt32 StartIndex, UInt32 maxNumberOfItems) para capturar solamente 100 archivos a la vez.In our example, we do this by using StorageFileQueryResult.GetFilesAsync(UInt32 StartIndex, UInt32 maxNumberOfItems) to only fetch 100 files at a time. La aplicación procesará los archivos y permitirá que el sistema operativo libere, a continuación, esa memoria.The app will then process the files and allow the OS to release that memory afterwards. Esta técnica limita la máxima memoria de la aplicación y garantiza que el sistema siga respondiendo.This technique caps the maximum memory of the app and ensures the system stays responsive. Por supuesto, tendrá que ajustar el número de archivos devueltos para su escenario, pero para asegurarse de obtener una experiencia con capacidad de respuesta para todos los usuarios, se recomienda no capturar más de 500 archivos a la vez.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.

EjemploExample  

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

ResultsResults 

Los archivos resultantes de StorageFile solo contienen las propiedades solicitadas, pero se devuelven 10 veces más rápido en comparación con el resto de IndexerOptions.The resulting StorageFile files only contain the properties requested, but are returned 10 times faster compared to the other IndexerOptions. La aplicación puede solicitar acceso a las propiedades que no están aún incluidas en la consulta, pero hay una penalización de rendimiento para abrir el archivo y recuperar esas propiedades. 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.  

Agregar carpetas a BibliotecasAdding folders to Libraries 

Las aplicaciones pueden solicitar al usuario agregar la ubicación al índice mediante StorageLibrary.RequestAddFolderAsync.Apps can request the user to add the location to the index using StorageLibrary.RequestAddFolderAsync. Una vez que se incluye la ubicación, se podrá indizar automáticamente y las aplicaciones pueden usar esta técnica para enumerar los archivos.Once the location is included, it will be automatically indexed and apps can use this technique to enumerate the files.  

Consulta tambiénSee also

Referencia de API de QueryOptionsQueryOptions API Reference
Enumerar y consultar archivos y carpetasEnumerate and query files and folders
Permisos de acceso a archivosFile access permissions