Share via


Accesso rapido alle proprietà file in UWP

Scopri come ottenere rapidamente un elenco di file e le proprietà da una libreria e usare tali proprietà in un'app.  

Prerequisiti

  • Programmazione asincrona per app UWP (Universal Windows Platform)Per informazioni su come scrivere app asincrone in C# o Visual Basic, vedi Chiamare API asincrone in C# o Visual Basic. Per scoprire come scrivere app asincrone in C++, vedere Programmazione asincrona in C++
  • Autorizzazioni di accesso alle librerie Il codice di questi esempi richiede la funzionalità picturesLibrary, tuttavia il tuo percorso file potrebbe richiedere una funzionalità differente o nessuna funzionalità. Per scoprire di più, vedere Autorizzazioni accesso file
  • Enumerazione di file semplice Questo esempio usa QueryOptions per impostare alcune proprietà avanzate di enumerazione. Per altre informazioni su come ottenere solo un semplice elenco di file per una directory di dimensioni inferiori, vedi Enumerare file e cartelle ed eseguire query su di essi

Utilizzo

Molte app devono elencare le proprietà di un gruppo di file, ma non sempre è necessario interagire direttamente con i file. Ad esempio, un'app di musica riproduce (apre) un file alla volta, ma richiede le proprietà di tutti i file in una cartella in modo che l'app possa mostrare la coda dei brani o in modo che l'utente possa scegliere un file valido per la riproduzione.

Gli esempi in questa pagina non devono essere usati nelle app che modificheranno i metadati di ogni file o nelle app che interagiscono con tutti gli oggetti StorageFile risultanti oltre a leggerne le proprietà. Vedi Enumerare file e cartelle ed eseguire query su di essi per altre informazioni. 

Enumerare tutte le immagini in una posizione

In questo esempio, provvederemo a:

  • Creare un oggetto QueryOptions per specificare che l'app vuole enumerare i file nel modo più rapido possibile.
  • Recuperare le proprietà dei file effettuando il paging degli oggetti StorageFile nell'app. Il paging dei file riduce la memoria usata dall'app e migliora la capacità di risposta percepita.

Creazione della query

Per creare la query, usiamo un oggetto QueryOptions per specificare che l'app è interessata a enumerare solo determinati tipi di file di immagini e per escludere i file protetti con Windows Information Protection (System.Security.EncryptionOwners). 

È importante impostare le proprietà di accesso per l'app tramite QueryOptions.SetPropertyPrefetch. Se l'app accede a una proprietà che non è caricata in background, subisce una riduzione significativa delle prestazioni.

L'impostazione di IndexerOption.OnlyUseIndexerAndOptimzeForIndexedProperties indica al sistema di restituire i risultati al più presto, ma di includere solo le proprietà specificate in SetPropertyPrefetch.

Paging dei risultati

Poiché è possibile che gli utenti dispongano di migliaia o milioni di file nella libreria di immagini, la chiamata a GetFilesAsync sovraccaricherebbe il computer creando un oggetto StorageFile per ogni immagine. Questo problema può essere risolto creando un numero fisso di oggetti StorageFile in una sola volta, elaborandoli nell'interfaccia utente, quindi rilasciando la memoria. 

In questo esempio si ottiene tale risultato tramite StorageFileQueryResult.GetFilesAsync (UInt32 StartIndex, UInt32 maxNumberOfItems) in modo da recuperare solo 100 file alla volta. L'app quindi elaborerà i file e permetterà al sistema operativo di rilasciare la memoria in seguito. Questa tecnica blocca le dimensioni massime di memoria dell'app e garantisce che il sistema resti reattivo. Naturalmente, è necessario modificare il numero di file restituito per uno scenario specifico, ma per garantire prestazioni ottimali per tutti gli utenti, si consiglia di recuperare non più 500 file per volta.

Esempio  

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

Risultati

I file StorageFile risultanti contengono solo le proprietà richieste, ma vengono restituiti 10 volte più velocemente rispetto alle altre enumerazioni IndexerOption. L'app può sempre richiedere l'accesso alle proprietà ancora non incluse nella query, ma l'apertura del file per recuperare tali proprietà può comportare una riduzione delle prestazioni.  

Aggiunta di cartelle alle librerie

Le app possono richiedere all'utente di aggiungere il percorso all'indice usando Storagelibrary.Requestaddfolderasync. Una volta incluso il percorso, questo verrà automaticamente indicizzato e le app potranno usare questa tecnica per enumerare i file.  

Vedi anche

Riferimento API QueryOptions
Enumerare file e cartelle ed eseguire query su di essi
Autorizzazioni di accesso ai file