659441806 发表于 2015-5-23 14:03:03

Metro App/Windows 8 递归读取"我的音乐"目录下的所有音频文件


[*].net 在以往的版本中递归函数返回参数时用 yield return 即可。但是在windows 8中,如果递归函数有用到 async 或 await 关键字的,那么yield return就不能像以前那样应用了。写入yield return时,编译都不能通过。
[*]为了接收在Windows 8中递归函数(引用了async/await 特性)的返回值,写一个访问“我的音乐”目录下的所有音频文件的小demo。
  递归实现遍历所有文件后并返回过滤好的音频文件
  



///
/// 加载“我的音乐”目录下的所有音频文件
///
/// “我的音乐”及其所有的子目录
/// 所有的音频文件
private async Task LoadMyMusic(StorageFolder storageFolder)
{
var allAudioFiles = new List();
IReadOnlyList folders = await storageFolder.GetFoldersAsync();
foreach (StorageFolder folder in folders)
{
List subfolderAudioFiles = await LoadMyMusic(folder);
allAudioFiles.AddRange(subfolderAudioFiles);
}
IReadOnlyList fileList = await storageFolder.GetFilesAsync();
foreach (StorageFile storageFile in fileList)
{
if (storageFile.ContentType.Contains("audio/"))
{
MusicProperties musicProperties = await storageFile.Properties.GetMusicPropertiesAsync();
String disPlayTitle = (musicProperties.Title.Equals(""))
? storageFile.DisplayName + "." + storageFile.DisplayType
: musicProperties.Title;
Debug.WriteLine("=======async===" + disPlayTitle + "==" + musicProperties.Artist + "==" + musicProperties.AlbumArtist + "==" + musicProperties.Bitrate + "===========");
allAudioFiles.Add(storageFile);
}
}
return allAudioFiles;
}
  
  
调用代码及测试



StorageFolder storageFolder = KnownFolders.MusicLibrary;
List storageFiles = await LoadMyMusic(storageFolder);
Debug.WriteLine("====loaded song list size[" + storageFiles.Count() + "]=====");
foreach (StorageFile storageFile in storageFiles)
{
MusicProperties musicProperties = await storageFile.Properties.GetMusicPropertiesAsync();
Song song = new Song(musicProperties.Title, musicProperties.Artist);
String disPlayTitle = (musicProperties.Title.Equals(""))
? storageFile.DisplayName + "." + storageFile.DisplayType
: musicProperties.Title;
Debug.WriteLine("=======gained===" + disPlayTitle + "==" + musicProperties.Artist + "==" + musicProperties.AlbumArtist + "==" + musicProperties.Bitrate + "===========");
}
  
  参考
  http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
  http://msdn.microsoft.com/zh-cn/library/vstudio/9k7k7cf0.aspx
  http://blogs.msdn.com/b/pfxteam/archive/2009/06/30/9809774.aspx
  http://stackoverflow.com/questions/5061761/is-it-possible-to-await-yield-return-dosomethingasync
  http://stackoverflow.com/questions/13808166/recursion-and-the-await-async-keywords
  http://stackoverflow.com/questions/6447626/async-ctp-recursion
页: [1]
查看完整版本: Metro App/Windows 8 递归读取"我的音乐"目录下的所有音频文件