如何在Windows Phone运行时中获取storage_folder中的所有文件

本文关键字:folder 文件 storage 获取 Windows Phone 运行时 | 更新日期: 2023-09-27 18:16:20

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

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

抛出ArgumentException异常:

类型为'System '的第一次异常。ArgumentException"发生

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

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

如何在Windows Phone运行时中获取storage_folder中的所有文件

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

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

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

使用CommonFileQuery.OrderByName这也是一个深度查询,因此结果将包含所有子文件夹中的所有文件而且很有效!div;)

MSDN说你得到System.ArgumentException如果:

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

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

真奇怪!看起来像一个bug在GetFilesAsync方法与所有commonfilequery选项除了DefaultQuery。使用DefaultQuery可以正常工作。

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

希望这对你有帮助!

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

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中没有其他方法可以获得完整的文件列表。微软出于一些奇怪的原因,会在不同版本之间破坏它的api。有些调用现在返回"not implemented"