【问题标题】:How to get all files in a StorageFolder in Windows Phone Runtime?如何在 Windows Phone 运行时获取 StorageFolder 中的所有文件?
【发布时间】:2014-08-03 07:34:23
【问题描述】:

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

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

抛出ArgumentException 异常:

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

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

在我一一查询子文件夹之前,有没有其他办法?

【问题讨论】:

  • 据我记得这是操作系统内部的第一次机会异常,无关紧要......你可以忽略它
  • @thumbmunkeys 它没有给我allFiles,忽略它不会解决问题

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      MSDN 说你得到System.ArgumentException 如果:

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

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

      【讨论】:

        【解决方案4】:

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

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

        希望这会有所帮助!

        【讨论】:

        • 是的,但是DefaultQuery 只提供没有子文件夹文件的顶级文件。
        • GetFilesAsync() 和 GetFilesAsync(CommonFileQuery.DefaultQuery) 是媒体库之外唯一支持的表单。
        【解决方案5】:

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

        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。一些调用现在返回“未实现”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-18
          • 1970-01-01
          • 2017-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多