File dan folder di pustaka Musik, Gambar, dan Video

Tambahkan folder musik, gambar, atau video yang ada ke pustaka yang sesuai. Anda juga dapat menghapus folder dari pustaka, mendapatkan daftar folder di pustaka, dan menemukan foto, musik, dan video yang disimpan.

Pustaka adalah kumpulan folder virtual, yang mencakup folder yang diketahui secara default ditambah folder lain yang telah ditambahkan pengguna ke pustaka dengan menggunakan aplikasi Anda atau salah satu aplikasi bawaan. Misalnya, pustaka Gambar menyertakan folder Gambar yang diketahui secara default. Pengguna dapat menambahkan folder ke, atau menghapusnya, pustaka Gambar dengan menggunakan aplikasi Anda atau aplikasi Foto bawaan.

Prasyarat

  • Memahami 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 lokasi

    Di Visual Studio, buka file manifes aplikasi di Manifest Designer. Pada halaman Kemampuan , pilih pustaka yang dikelola aplikasi Anda.

    • Pustaka Musik
    • Pustaka Gambar
    • Pustaka Video

    Untuk mempelajari selengkapnya, lihat Izin akses file.

Mendapatkan referensi ke pustaka

Catatan

Ingatlah untuk mendeklarasikan kemampuan yang sesuai. Lihat Deklarasi kemampuan aplikasi untuk informasi selengkapnya.  

Untuk mendapatkan referensi ke pustaka Musik, Gambar, atau Video pengguna, panggil metode StorageLibrary.GetLibraryAsync. Berikan nilai yang sesuai dari enumerasi KnownLibraryId.

var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);

Mendapatkan daftar folder dalam pustaka

Untuk mendapatkan daftar folder di pustaka, dapatkan nilai properti StorageLibrary.Folders.

using Windows.Foundation.Collections;
IObservableVector<Windows.Storage.StorageFolder> myPictureFolders = myPictures.Folders;

Dapatkan folder di pustaka tempat file baru disimpan secara default

Untuk mendapatkan folder di pustaka tempat file baru disimpan secara default, dapatkan nilai properti StorageLibrary.SaveFolder.

Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;

Menambahkan folder yang sudah ada ke pustaka

Untuk menambahkan folder ke pustaka, Anda memanggil StorageLibrary.RequestAddFolderAsync. Mengambil Pustaka Gambar sebagai contoh, memanggil metode ini menyebabkan pemilih folder ditampilkan kepada pengguna dengan tombol Tambahkan folder ini ke Gambar . Jika pengguna memilih folder maka folder tetap berada di lokasi aslinya pada disk dan menjadi item di properti StorageLibrary.Folders (dan di aplikasi Foto bawaan), tetapi folder tidak muncul sebagai anak dari folder Gambar di File Explorer.

Windows.Storage.StorageFolder newFolder = await myPictures.RequestAddFolderAsync();

Menghapus folder dari pustaka

Untuk menghapus folder dari pustaka, panggil metode StorageLibrary.RequestRemoveFolderAsync dan tentukan folder yang akan dihapus. Anda dapat menggunakan StorageLibrary.Folders dan kontrol ListView (atau serupa) agar pengguna memilih folder yang akan dihapus.

Saat Anda memanggil StorageLibrary.RequestRemoveFolderAsync, pengguna melihat dialog konfirmasi yang mengatakan bahwa folder "tidak akan muncul di Gambar lagi, tetapi tidak akan dihapus." Artinya, folder tetap berada di lokasi aslinya pada disk, dihapus dari properti StorageLibrary.Folders , dan tidak akan lagi disertakan dalam aplikasi Foto bawaan.

Contoh berikut mengasumsikan bahwa pengguna telah memilih folder untuk dihapus dari kontrol ListView bernama lvPictureFolders.

bool result = await myPictures.RequestRemoveFolderAsync(folder);

Mendapatkan pemberitahuan tentang perubahan pada daftar folder dalam pustaka

Untuk mendapatkan pemberitahuan tentang perubahan pada daftar folder di pustaka, daftarkan handler untuk peristiwa StorageLibrary.DefinitionChanged pustaka.

myPictures.DefinitionChanged += MyPictures_DefinitionChanged;

void HandleDefinitionChanged(Windows.Storage.StorageLibrary sender, object args)
{
    // ...
}

Folder pustaka media

Perangkat menyediakan lima lokasi yang telah ditentukan sebelumnya bagi pengguna dan aplikasi untuk menyimpan file media. Aplikasi bawaan menyimpan media yang dibuat pengguna dan media yang diunduh di lokasi ini.

Lokasi-lokasi tersebut adalah:

  • Folder gambar . Berisi gambar.

    • folder Kamera Roll. Berisi foto dan video dari kamera bawaan.

    • Folder Gambar Tersimpan. Berisi gambar yang disimpan pengguna dari aplikasi lain.

  • Folder musik . Berisi lagu, podcast, dan buku audio.

  • Folder video. Berisi video.

Pengguna atau aplikasi juga dapat menyimpan file media di luar folder pustaka media pada kartu SD. Untuk menemukan file media dengan andal pada kartu SD, pindai konten kartu SD, atau minta pengguna untuk menemukan file dengan menggunakan pemilih file. Untuk informasi selengkapnya, lihat Mengakses kartu SD.

Mengkueri pustaka media

Untuk mendapatkan kumpulan file, tentukan pustaka dan jenis file yang Anda inginkan.

using Windows.Storage;
using Windows.Storage.Search;

private async void getSongs()
{
    QueryOptions queryOption = new QueryOptions
        (CommonFileQuery.OrderByTitle, new string[] { ".mp3", ".mp4", ".wma" });

    queryOption.FolderDepth = FolderDepth.Deep;

    Queue<IStorageFolder> folders = new Queue<IStorageFolder>();

    var files = await KnownFolders.MusicLibrary.CreateFileQueryWithOptions
      (queryOption).GetFilesAsync();

    foreach (var file in files)
    {
        // do something with the music files
    }
}

Hasil kueri mencakup penyimpanan internal dan yang dapat dilepas

Pengguna dapat memilih untuk menyimpan file secara default pada kartu SD opsional. Namun, aplikasi dapat menolak mengizinkan file disimpan di kartu SD. Akibatnya, pustaka media dapat dibagi di seluruh penyimpanan internal perangkat dan kartu SD.

Anda tidak perlu menulis kode tambahan untuk menangani kemungkinan ini. Metode di namespace Windows.Storage yang mengkueri folder yang diketahui secara transparan menggabungkan hasil kueri dari kedua lokasi. Anda tidak perlu menentukan kemampuan removableStorage dalam file manifes aplikasi untuk mendapatkan hasil gabungan ini.

Pertimbangkan status penyimpanan perangkat yang ditampilkan dalam gambar berikut:

images on the phone and sd card

Jika Anda mengkueri konten Pustaka Gambar dengan memanggil await KnownFolders.PicturesLibrary.GetFilesAsync(), hasilnya menyertakan internalPic.jpg dan SDPic.jpg.

Bekerja dengan foto

Pada perangkat tempat kamera menyimpan gambar resolusi rendah dan gambar resolusi tinggi dari setiap gambar, kueri mendalam hanya mengembalikan gambar resolusi rendah.

Folder Kamera Roll dan Gambar Tersimpan tidak mendukung kueri mendalam.

Membuka foto di aplikasi yang mengambilnya

Jika Anda ingin membiarkan pengguna membuka foto lagi nanti di aplikasi yang mengambilnya, Anda dapat menyimpan CreatorAppId dengan metadata foto dengan menggunakan kode yang mirip dengan contoh berikut. Dalam contoh ini, testPhoto adalah StorageFile.

IDictionary<string, object> propertiesToSave = new Dictionary<string, object>();

propertiesToSave.Add("System.CreatorOpenWithUIOptions", 1);
propertiesToSave.Add("System.CreatorAppId", appId);

testPhoto.Properties.SavePropertiesAsync(propertiesToSave).AsyncWait();   

Menggunakan metode stream untuk menambahkan file ke pustaka media

Saat Anda mengakses pustaka media dengan menggunakan folder yang diketahui seperti KnownFolders.PictureLibrary, dan Anda menggunakan metode streaming untuk menambahkan file ke pustaka media, Anda harus memastikan untuk menutup semua aliran yang dibuka kode Anda. Jika tidak, metode ini gagal menambahkan file ke pustaka media seperti yang diharapkan karena setidaknya satu aliran masih memiliki handel ke file.

Misalnya, saat Anda menjalankan kode berikut, file tidak ditambahkan ke pustaka media. Di baris kode, using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0)), baik metode OpenAsync maupun metode GetOutputStreamAt membuka aliran. Namun hanya aliran yang dibuka oleh metode GetOutputStreamAt yang dibuang sebagai akibat dari pernyataan penggunaan . Aliran lainnya tetap terbuka dan mencegah penyimpanan file.

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");
using (var sourceStream = (await sourceFile.OpenReadAsync()).GetInputStreamAt(0))
{
    using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0))
    {
        await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream);
    }
}

Untuk berhasil menggunakan metode stream untuk menambahkan file ke pustaka media, pastikan untuk menutup semua aliran yang dibuka kode Anda, seperti yang ditunjukkan dalam contoh berikut.

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");

using (var sourceStream = await sourceFile.OpenReadAsync())
{
    using (var sourceInputStream = sourceStream.GetInputStreamAt(0))
    {
        using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            using (var destinationOutputStream = destinationStream.GetOutputStreamAt(0))
            {
                await RandomAccessStream.CopyAndCloseAsync(sourceInputStream, destinationStream);
            }
        }
    }
}