Akses cepat ke properti file di UWP

Pelajari cara mengumpulkan daftar file dan propertinya dengan cepat dari pustaka dan menggunakan properti tersebut di aplikasi.  

Prasyarat

  • Pemrograman asinkron untuk aplikasi Platform Windows Universal (UWP) Anda dapat mempelajari cara menulis aplikasi asinkron di C# atau Visual Basic, lihat Memanggil API asinkron di C# atau Visual Basic. Untuk mempelajari cara menulis aplikasi asinkron di C++, lihat Pemrograman asinkron di C++
  • Izin akses ke Pustaka Kode dalam contoh ini memerlukan kemampuan picturesLibrary , tetapi lokasi file Anda mungkin memerlukan kemampuan yang berbeda, atau tidak ada kemampuan sama sekali. Untuk mempelajari selengkapnya, lihat Izin akses file
  • Enumerasi file sederhana Contoh ini menggunakan QueryOptions untuk mengatur beberapa properti enumerasi tingkat lanjut. Untuk mempelajari selengkapnya tentang hanya mendapatkan daftar file sederhana untuk direktori yang lebih kecil, lihat Menghitung dan mengkueri file dan folder

Penggunaan

Banyak aplikasi perlu mencantumkan properti sekelompok file, tetapi tidak selalu perlu berinteraksi dengan file secara langsung. Misalnya, aplikasi musik memutar (membuka) satu file pada satu waktu, tetapi memerlukan properti semua file dalam folder sehingga aplikasi dapat menampilkan antrean lagu, atau sehingga pengguna dapat memilih file yang valid untuk diputar.

Contoh di halaman ini tidak boleh digunakan dalam aplikasi yang akan memodifikasi metadata setiap file atau aplikasi yang berinteraksi dengan semua StorageFiles yang dihasilkan di luar membaca propertinya. Lihat Menghitung dan mengkueri file dan folder untuk informasi selengkapnya. 

Menghitung semua gambar di lokasi

Dalam contoh ini, kita akan

  • Buat objek QueryOptions untuk menentukan bahwa aplikasi ingin menghitung file secepat mungkin.
  • Ambil properti file dengan membuat halaman objek StorageFile ke dalam aplikasi. Paging file dalam mengurangi memori yang digunakan oleh aplikasi dan meningkatkan responsivitas yang dirasakan.

Membuat kueri

Untuk membuat kueri, kami menggunakan objek QueryOptions untuk menentukan bahwa aplikasi tertarik untuk menghitung hanya jenis file gambar tertentu dan untuk memfilter file yang dilindungi dengan Perlindungan Informasi Windows (System.Security.EncryptionOwners). 

Penting untuk mengatur properti yang akan diakses aplikasi menggunakan QueryOptions.SetPropertyPrefetch. Jika aplikasi mengakses properti yang tidak diambil sebelumnya, aplikasi akan dikenakan penalti performa yang signifikan.

Mengatur IndexerOption.OnlyUseIndexerAndOptimzeForIndexedProperties memberi tahu sistem untuk mengembalikan hasil secepat mungkin, tetapi hanya menyertakan properti yang ditentukan dalam SetPropertyPrefetch.

Halaman dalam hasil

Pengguna mungkin memiliki ribuan atau jutaan file di pustaka gambar mereka, jadi memanggil GetFilesAsync akan membanjiri komputer mereka karena membuat StorageFile untuk setiap gambar. Ini dapat diselesaikan dengan membuat jumlah StorageFiles tetap sekaligus, memprosesnya ke UI, lalu merilis memori. 

Dalam contoh kami, kami melakukan ini dengan menggunakan StorageFileQueryResult.GetFilesAsync(UInt32 StartIndex, UInt32 maxNumberOfItems) untuk hanya mengambil 100 file sekali waktu. Aplikasi kemudian akan memproses file dan memungkinkan OS merilis memori tersebut setelahnya. Teknik ini membatasi memori maksimum aplikasi dan memastikan sistem tetap responsif. Tentu saja, Anda harus menyesuaikan jumlah file yang dikembalikan untuk skenario Anda, tetapi untuk memastikan pengalaman responsif bagi semua pengguna, disarankan untuk tidak mengambil lebih dari 500 file pada satu waktu.

Contoh  

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

Hasil

File StorageFile yang dihasilkan hanya berisi properti yang diminta, tetapi dikembalikan 10 kali lebih cepat dibandingkan dengan IndexerOptions lainnya. Aplikasi masih dapat meminta akses ke properti yang belum disertakan dalam kueri, tetapi ada penalti performa untuk membuka file dan mengambil properti tersebut.  

Menambahkan folder ke Pustaka

Aplikasi dapat meminta pengguna untuk menambahkan lokasi ke indeks menggunakan StorageLibrary.RequestAddFolderAsync. Setelah lokasi disertakan, lokasi akan diindeks secara otomatis dan aplikasi dapat menggunakan teknik ini untuk menghitung file.  

Baca juga

Referensi API QueryOptions
Menghitung dan mengkueri file dan folder
Izin akses file