如何在Windows Phone Runtime中获取StorageFolder中的所有文件?

时间:2014-08-03 07:34:23

标签: c# windows-runtime windows-phone-8.1 storagefolder

我想获取文件夹及其子文件夹中的所有文件。但像这样的扁平查询:

var allFiles = await myFolder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName);

抛出ArgumentException例外:

  

类型' System.ArgumentException'的第一次机会异常。发生

     

其他信息:价值不在预期范围内。

在我逐个查询子文件夹之前,还有其他方法吗?

4 个答案:

答案 0 :(得分:4)

您希望所有文件和文件夹都是根文件夹的后代,而不仅仅是浅层文件。对于大多数文件夹,枚举所有内容及其子文件夹内容的唯一方法是:

  1. 使用StorageFolder.GetFilesAsync()作为文件
  2. 使用StorageFolder.GetFoldersAsync()检索所有子文件夹
  3. 对步骤2中找到的所有子文件夹进行递归重复。
  4. 如果您正在寻找特定类型的媒体,有一种解决方法。说明是here。这些位置组合和CommonFile / FolderQuery选项将使设备深入搜索媒体并返回有序结果。

答案 1 :(得分:1)

使用CommonFileQuery.OrderByName这也是一个深度查询,因此结果将包含所有子文件夹中的所有文件 它的工作原理! ;)

答案 2 :(得分:0)

这很奇怪!看起来像GetFilesAsync方法中的一个错误,除了DefaultQuery之外的所有CommaonFileQuery选项。它与DefaultQuery一起工作正常。

  var allFiles = await myFolder.GetFilesAsync(CommonFileQuery.DefaultQuery);

希望这有帮助!

答案 3 :(得分:-1)

我遇到了同样的问题,通过递归预加载文件路径解决了这个问题:

private static List<string> mContentFilenames = new List<string>();


private static void preloadContentFilenamesRecursive(StorageFolder sf)
{
    var files = sf.GetFilesAsync().AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
    if (files != null)
    {
        foreach (var f in files)
        {
            mContentFilenames.Add(f.Path.Replace('\\','/'));
        }
    }
    var folders = sf.GetFoldersAsync().AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
    if (folders != null)
    {
        foreach (var f in folders)
        {
            preloadContentFilenamesRecursive(f);
        }
    }

}

private static void preloadContentFilenames()
{
    if (mContentFilenames.Count > 0)
        return;
    var installed_loc = Windows.ApplicationModel.Package.Current.InstalledLocation;
    var content_folder = installed_loc.GetFolderAsync("Content").AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
    if (content_folder != null)
        preloadContentFilenamesRecursive(content_folder);
}

private static bool searchContentFilename(string name)
{
    var v = from val in mContentFilenames where val.EndsWith(name.Replace('\\', '/')) select val;
    return v.Any();
}

不知道为什么downvoted,没有其他方法可以在WP8.1中获得完整的文件列表。 MSFT出于某种奇怪的原因从版本到版本破坏了它的apis。现在有些电话会返回&#34;未实施&#34;。