Metro App/Windows 8 递归读取"我的音乐"目录下的所有音频文件
- .net 在以往的版本中递归函数返回参数时用 yield return 即可。但是在windows 8中,如果递归函数有用到 async 或 await 关键字的,那么yield return就不能像以前那样应用了。写入yield return时,编译都不能通过。
- 为了接收在Windows 8中递归函数(引用了async/await 特性)的返回值,写一个访问“我的音乐”目录下的所有音频文件的小demo。
递归实现遍历所有文件后并返回过滤好的音频文件
/// <summary> /// 加载“我的音乐”目录下的所有音频文件 /// </summary> /// <param name="storageFolder">“我的音乐”及其所有的子目录</param> /// <returns>所有的音频文件</returns> private async Task<List<StorageFile>> LoadMyMusic(StorageFolder storageFolder) { var allAudioFiles = new List<StorageFile>(); IReadOnlyList<StorageFolder> folders = await storageFolder.GetFoldersAsync(); foreach (StorageFolder folder in folders) { List<StorageFile> subfolderAudioFiles = await LoadMyMusic(folder); allAudioFiles.AddRange(subfolderAudioFiles); } IReadOnlyList<StorageFile> 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<StorageFile> 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