(Отговорът е преустроен, за да бъде по-ясен)
Ако сте декларирали във файл package.appxmanifest
:
Music Library
възможност в Възможности
File Type Association
в Декларации (не съм сигурен дали това е необходимо, ако имате достъп само до музикалната библиотека)
тогава ще можете да извличате файлове от папка Music Library
по следния начин:
StorageFolder folder = KnownFolders.MusicLibrary;
// below code will work unless 'fileName.mp3' is in
// your Music folder either on phone or SD card
StorageFile file = await folder.GetFileAsync("fileName.mp3");
// you can access them also with path, but in this case
// also Folders must be in Music folder
string path = @"Test\ccc.mp3";
StorageFile file = await folder.GetFileAsync(path);
За да обобщим, вие ще можете да получите достъп от KnownFolders.MusicLibrary
само до файлове, които са или на телефон, или на SD карта, но в папка Музика - техните пътища тогава ще бъдат:
C:\Data\Users\Public\Music\test.mp3 - за телефон
D:\Music\Test\test2.mp3 - за SD карта
Не забравяйте, че достъпът чрез StorageFolder.GetFileAsync() работи спрямо на StorageFolder (ще работи и с пълен път, вижте забележката по-долу):
Името (или пътя спрямо текущата папка) на файла за извличане.
В този случай, за да получите горните файлове, ще използвате имена на файлове като: test.mp3
и Test\test2.mp3
.
Вие няма да можете да получите други файлове като D:\xxx.mp3
- той не е в музикалната библиотека - той е на SD карта, ако искате да получите достъп до него, ще трябва да го направите чрез KnownFolders.RemovableDevices - когато сте добавили необходимите възможности, тогава трябва да имате достъп до това чрез пълен път. Но също така моля, запомнете забележката:
Не разчитайте на това свойство за достъп до файл, защото някои файлове може да нямат пътеки към файловата система. Например, ако файлът е подкрепен от URI или е избран чрез инструмента за избор на файл, не е гарантирано, че файлът има път към файловата система.
В нашата дискусия се оказа, че използвате CommonFileQuery.OrderByName
за получаване на файлове. Както проверих там (IMO), може да има малък бъг - в описанието на VS се казва, че:
Резултатите от заявките за дълбоки заявки включват всички файлове във всички подпапки на папката, за която се извършва заявка, и ги сортират въз основа на посочените метаданни.
Изпълнение на част от код:
// a method to retrieve files from Musiic Library recursively
private async Task RetriveFilesInFolders(List<StorageFile> list, StorageFolder parent)
{
foreach (var item in await parent.GetFilesAsync()) list.Add(item);
foreach (var item in await parent.GetFoldersAsync()) await RetriveFilesInFolders(list, item);
}
// then I've used it like this:
StorageFolder folder = KnownFolders.MusicLibrary;
List<StorageFile> listOfFiles = new List<StorageFile>();
await RetriveFilesInFolders(listOfFiles, folder);
// as a result of above code I have a List of 5 files that are in Music Library
List<IStorageItem> filesFolders = (await folder.GetItemsAsync()).ToList();
List<StorageFile> items = (await folder.GetFilesAsync(CommonFileQuery.OrderByName)).ToList();
// as a result here I've 14 files that are in Music Library and SD card, and Phone
даде резултати:
- в първия случай 5 файла, които всъщност са в папка Музика и нейните подпапки,
- във втори случай - 14 файла, които са в: Музикална библиотека, SD карта и Телефон
Можете лесно да погледнете Path
в режим на отстраняване на грешки и ще видите, че някои от файловете във втория метод имат D:\file.mp3
и така нататък - те не са в музикалната библиотека - така че няма да можете да ги получите до KnownFolders.MusicLibrary
. Ако искате да ги получите, тогава ще трябва да използвате други KnownFolders - в този случай SD карта:
StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault();
StorageFile file = await sdCard.GetFileAsync("xyz.mp3"); // for D:\xyz.mp3
StorageFile file = await sdCard.GetFileAsync("XYZ\xyz.mp3"); // for D:\XYZ\xyz.mp3
person
Romasz
schedule
25.04.2014