3

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

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

抛出ArgumentException异常:

发生“System.ArgumentException”类型的第一次机会异常

附加信息:值不在预期范围内。

在我一一查询子文件夹之前,没有别的办法了吗?

4

5 回答 5

5

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

  1. 用于StorageFolder.GetFilesAsync()文件
  2. 用于StorageFolder.GetFoldersAsync()检索所有子文件夹
  3. 对您在步骤 2 中找到的所有子文件夹递归重复。

如果您正在寻找特定类型的媒体,有一个解决方法。说明在这里。这几个位置和 CommonFile/FolderQuery 选项的组合将为设备提供对媒体的深度搜索并返回排序结果。

于 2014-08-04T17:06:39.287 回答
1

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

于 2015-01-02T17:57:19.250 回答
1

MSDN 说如果你得到System.ArgumentException

您为不是库文件夹的文件夹指定了枚举DefaultQuery以外的值。CommonFileQuery

https://msdn.microsoft.com/en-us/library/windows/apps/BR211591.aspx

于 2015-09-20T06:23:00.307 回答
0

这很奇怪!看起来像 GetFilesAsync 方法中的错误,除了DefaultQuery. 它与 DefaultQuery 一起工作正常。

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

希望这可以帮助!

于 2014-08-03T10:57:30.763 回答
-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();
}

不知道为什么不赞成,没有其他方法可以在 WP8.1 中获得完整的文件列表。MSFT 出于某种奇怪的原因在不同版本之间破坏了它的 api。一些调用现在返回“未实现”。

于 2016-12-26T16:36:50.767 回答