(Ответ перестроить, чтобы быть более понятным)
Если вы объявили в файле package.appxmanifest
:
Music Library
возможность в разделе Возможности
File Type Association
в Declarations (я не уверен, что это необходимо, если вы имеете доступ только к музыкальной библиотеке)
тогда вы сможете получить файлы из папки 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