如果您在
package.appxmanifest
文件中声明了以下内容:
- 在 Capabilities 中声明了
Music Library
权限
- 在 Declarations 中声明了
File Type Association
(如果您仅访问 Music Library,则我不确定是否需要此项)
那么您就可以像这样从
Music Library
文件夹中检索文件:
StorageFolder folder = KnownFolders.MusicLibrary;
StorageFile file = await folder.GetFileAsync("fileName.mp3");
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
获取文件。根据我检查,在那里可能存在一个小错误 - 在VS描述中说:
深度查询的查询结果包括要查询的文件夹中所有子文件夹中的所有文件,并根据指定的元数据对它们进行排序。
运行以下代码:
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);
}
StorageFolder folder = KnownFolders.MusicLibrary;
List<StorageFile> listOfFiles = new List<StorageFile>();
await RetriveFilesInFolders(listOfFiles, folder);
List<IStorageItem> filesFolders = (await folder.GetItemsAsync()).ToList();
List<StorageFile> items = (await folder.GetFilesAsync(CommonFileQuery.OrderByName)).ToList();
已经给出了结果:
- 在第一种情况下,有5个文件实际上位于音乐文件夹及其子文件夹中,
- 在第二种情况下-有14个文件分别位于:音乐库、SD卡和手机中
您可以在调试模式下轻松查看路径
,您会发现第二种方法中的某些文件具有D:\file.mp3
等等 - 它们不在音乐库中 - 因此您将无法通过KnownFolders.MusicLibrary
获取它们。 如果您想获得它们,则必须使用其他已知文件夹 - 在这种情况下是SD卡:
StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices;
StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault();
StorageFile file = await sdCard.GetFileAsync("xyz.mp3");
StorageFile file = await sdCard.GetFileAsync("XYZ\xyz.mp3");