(答案重建更清楚)
如果你在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 提供 - 当您添加了所需的功能时,您应该能够通过完整路径访问它。还有please remember about the remark:
不要依赖此属性来访问文件,因为某些文件可能没有文件系统路径。例如,如果文件由 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
已经给出结果:
- 在第一种情况下,实际上是 Music 文件夹及其子文件夹中的 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