在Windows Store应用程序中递归获取文件和文件夹

4

在 Windows Forms 应用程序中,这个 是我递归搜索文件夹中所有文件的方法。我知道 Windows Store 应用程序基本上是沙盒化的,但是肯定有一种方法可以获取 KnownFolder 目录中的所有文件。我一直试图使用音乐目录来实现这一点。然而,它对我没有起作用。我已经进行了谷歌搜索,但我找不到任何说明如何实现此功能的线程。我尝试了以下代码:

private async void dirScan(string dir)
    {
        var folDir = await StorageFolder.GetFolderFromPathAsync(dir);
        foreach (var d in await folDir.GetFoldersAsync())
        {
            foreach(var f in await d.GetFilesAsync())
            {
                knownMusicDir.Add(f.Path.ToString());
            }
            dirScan(d.ToString());
        }
    }

我希望有人能够查看我的代码并帮我纠正错误。提前感谢!


我很好奇——你这个迭代的目标是什么?我问这个问题是因为通常使用StorageFolder.Create[File | Folder]Query[WithOptions]的文件/文件夹查询更容易,你还可以通过Common[File | Folder]Query参数进行排序和分组。特别是对于音乐库,有许多选项可以消除直接枚举文件夹的需要。请查看文件夹枚举示例以获取详细信息,http://code.msdn.microsoft.com/windowsapps/Folder-enumeration-sample-33ebd000。 - Kraig Brockschmidt - MSFT
2个回答

5
您可以使用这个扩展方法:
public static async Task<IEnumerable<StorageFile>> GetAllFilesAsync(this StorageFolder folder)
{
        IEnumerable<StorageFile> files = await folder.GetFilesAsync();
        IEnumerable<StorageFolder> folders = await folder.GetFoldersAsync();
        foreach (StorageFolder subfolder in folders)
            files = files.Concat(await subfolder.GetAllFilesAsync());
        return files;
}

3
这对于我来说是有效的,适用于KnownFolders:
ObservableCollection<string> files; 

public MainPage()
{
    this.InitializeComponent();
    files = new ObservableCollection<string>();
}

private async void GetFiles(StorageFolder folder)
{
    StorageFolder fold = folder;

    var items = await fold.GetItemsAsync();

    foreach (var item in items)
    {
        if (item.GetType() == typeof(StorageFile))
            files.Add(item.Path.ToString());
        else
            GetFiles(item as StorageFolder);
    }

    listView.ItemsSource = files;      
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接