Megosztás a következőn keresztül:


Fájlok és mappák a Zene, Képek és Videók tárakban

Meglévő zene-, kép- vagy videómappákat adhat hozzá a megfelelő tárakhoz. Mappákat is eltávolíthat a tárakból, lekérheti a tárak mappáinak listáját, és felderítheti a tárolt fényképeket, zenéket és videókat.

A tárak mappák virtuális gyűjteményei, amelyek alapértelmezés szerint tartalmaznak egy ismert mappát, valamint azokat a mappákat, amelyeket a felhasználó az alkalmazás vagy valamelyik beépített alkalmazás használatával adott hozzá a tárhoz. A Képek tár például alapértelmezés szerint tartalmazza az ismert Képek mappát. A felhasználó hozzáadhat mappákat a Képek tárhoz, vagy eltávolíthatja őket az alkalmazás vagy a beépített Fényképek alkalmazás használatával.

Előfeltételek

  • Univerzális Windows-platform (UWP) alkalmazások aszinkron programozásának ismertetése

    Megtudhatja, hogyan írhat aszinkron alkalmazásokat c# vagy Visual Basic nyelven, lásd Aszinkron API-k meghívása C# vagy Visual Basic. Az aszinkron alkalmazások C++-ban való írásáról további információt Aszinkron programozás c++című témakörben talál.

  • hozzáférési engedélyek a helyhez

    Nyissa meg az alkalmazásjegyzékfájlt a Visual Studióban a Jegyzéktervezőben. A Képességek lapon válassza ki az alkalmazás által kezelt könyvtárakat.

    • Zenetár
    • Képtár
    • Videótár

    További információ: Fájlelérési engedélyek.

Hivatkozás beszerzése egy könyvtárra

Megjegyzés:

Ne felejtse el deklarálni a megfelelő képességet. További információt az alkalmazásképesség-deklarációkban talál.  

Ha a felhasználó Zene, Képek vagy Video könyvtárára szeretne hivatkozni, hívja meg a StorageLibrary.GetLibraryAsync metódust. Adja meg a megfelelő értéket a KnownLibraryId enumerálásból.

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

A tárban lévő mappák listájának lekérése

A tárban lévő mappák listájának lekéréséhez kérje le a StorageLibrary.Folders tulajdonság értékét.

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

Szerezze meg azt a mappát egy könyvtárban, ahová az új fájlok alapértelmezés szerint vannak mentve.

Ha meg szeretné találni azt a mappát egy könyvtárban, ahová új fájlokat alapértelmezés szerint mentenek, kérje le a StorageLibrary.SaveFolder tulajdonság értékét.

Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;

Meglévő mappa hozzáadása tárhoz

Ha mappát szeretne hozzáadni egy könyvtárhoz, hívja meg a StorageLibrary.RequestAddFolderAsync. Ha a Képek tár példáját vesszük, ennek a metódusnak a meghívása során egy mappaválasztó jelenik meg a felhasználó számára egy Adja hozzá ezt a mappát a Képekhez gombbal. Ha a felhasználó kiválaszt egy mappát, akkor a mappa az eredeti helyén marad a lemezen, és a StorageLibrary.Folders tulajdonság elemévé válik (és a beépített Fényképek alkalmazásban), de a mappa nem jelenik meg a Fájlkezelő Képek mappájának gyermekeként.

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

Mappa eltávolítása tárból

Ha el szeretne távolítani egy mappát egy tárból, hívja meg a StorageLibrary.RequestRemoveFolderAsync metódust, és adja meg az eltávolítandó mappát. A StorageLibrary.Folders és egy ListView vezérlőelem (vagy hasonló) használatával kijelölhet egy eltávolítandó mappát.

Amikor meghívja StorageLibrary.RequestRemoveFolderAsync, a felhasználó megjelenik egy megerősítést kérő párbeszédpanelen, amely szerint a mappa "többé nem jelenik meg a Képekben, de nem törlődik". Ez azt jelenti, hogy a mappa az eredeti helyén marad a lemezen, törlődik a StorageLibrary.Folders tulajdonságból, és a továbbiakban nem fog szerepelni a beépített Fényképek alkalmazásban.

Az alábbi példa feltételezi, hogy a felhasználó kiválasztotta azt a mappát, amelyet el szeretne távolítani egy ListView vezérlőelemből lvPictureFolders.

bool result = await myPictures.RequestRemoveFolderAsync(folder);

Értesítés a tárban lévő mappák listájának változásairól

Ha értesítést szeretne kapni a tár mappák listájának változásairól, regisztráljon egy kezelőt a tár StorageLibrary.DefinitionChanged eseményéhez.

myPictures.DefinitionChanged += MyPictures_DefinitionChanged;

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

Médiatár mappái

Az eszköz öt előre meghatározott helyet biztosít a felhasználók és alkalmazások számára a médiafájlok tárolásához. A beépített alkalmazások ezekben a helyeken tárolják a felhasználó által létrehozott és letöltött médiatartalmakat.

A helyek a következők:

  • Képek mappa. Képeket tartalmaz.

    • Kameratekercs mappát. A beépített kamerából származó fényképeket és videókat tartalmazza.

    • Mentett képek mappa. Olyan képeket tartalmaz, amelyeket a felhasználó más alkalmazásokból mentett.

  • Zene mappát. Dalokat, podcastokat és hangoskönyveket tartalmaz.

  • Video mappát. Videókat tartalmaz.

A felhasználók vagy alkalmazások a médiatár mappáján kívül is tárolhatnak médiafájlokat az SD-kártyán. Ha megbízhatóan szeretne médiafájlt keresni az SD-kártyán, vizsgálja meg az SD-kártya tartalmát, vagy kérje meg a felhasználót, hogy keresse meg a fájlt egy fájlválasztó használatával. További információ: Az SD-kártyaelérése.

Médiatárak lekérdezése

Fájlok gyűjteményének lekéréséhez adja meg a tárat és a kívánt fájltípust.

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

A lekérdezés eredményei közé tartozik a belső és a cserélhető tároló is

A felhasználók alapértelmezés szerint tárolhatnak fájlokat az opcionális SD-kártyán. Az alkalmazások azonban letilthatják a fájlok SD-kártyán való tárolásának engedélyezését. Ennek eredményeképpen a médiatárak feloszthatók az eszköz belső tárhelyére és az SD-kártyára.

A lehetőség kezeléséhez nem kell további kódot írnia. A Windows.Storage metódusai névtérben, amelyek az ismert mappákat transzparens módon kérdezik le, mindkét helyről egyesítik a lekérdezés eredményeit. Az egyesített eredmények lekéréséhez sem kell megadnia a removableStorage képességet az alkalmazásjegyzékfájlban.

Vegye figyelembe az eszköz tárolójának állapotát az alábbi képen:

telefonon és sd kártyán lévő képek

Ha a Képek tár tartalmát a(z) await KnownFolders.PicturesLibrary.GetFilesAsync()meghívásával kérdezi le, az eredmények tartalmazni fogják mind a(z) internalPic.jpg-t, mind a(z) SDPic.jpg-t.

Fényképek használata

Azokon az eszközökön, ahol a kamera egy kis felbontású képet és egy nagy felbontású képet is ment minden képről, a mély lekérdezések csak az alacsony felbontású képet adják vissza.

A Camera Roll és a Mentett képek mappa nem támogatja a mély lekérdezéseket.

Fénykép megnyitása az alkalmazásban, amely rögzítette

Ha azt szeretné, hogy a felhasználó később újra megnyitjon egy fényképet a rögzített alkalmazásban, az alábbi példához hasonló kód használatával mentheti a CreatorAppId a fénykép metaadataival. Ebben a példában testPhoto egy StorageFile.

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

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

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

Fájl hozzáadása a médiatárhoz stream módszerekkel

Ha egy médiatárat egy ismert mappával(például KnownFolders.PictureLibrary) ér el, és streamelési módszerekkel ad hozzá egy fájlt a médiatárhoz, mindenképpen be kell zárnia a kód által megnyitott összes streamet. Ellenkező esetben ezek a metódusok nem tudják a vártnak megfelelően hozzáadni a fájlt a médiatárhoz, mert legalább egy stream rendelkezik leíróval a fájlhoz.

Ha például a következő kódot futtatja, a fájl nem lesz hozzáadva a médiatárhoz. A kódsorban using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0))az OpenAsync metódus és a GetOutputStreamAt metódus is megnyit egy streamet. Azonban csak a GetOutputStreamAt metódus által megnyitott stream lesz megsemmisítve a using utasítás következtében. A másik stream nyitva marad, és megakadályozza a fájl mentését.

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

Ha sikeresen szeretne streammetelyeket használni egy fájl médiatárhoz való hozzáadásához, zárja be a kód által megnyitott összes streamet, ahogy az az alábbi példában is látható.

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