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

posted @ 2013-04-23 17:46  buzheteng  阅读(1042)  评论(0编辑  收藏  举报