UWP - 如何从文件夹中可靠地获取文件?

时间:2017-09-30 21:56:20

标签: uwp getfiles

如果文件夹包含许多文件(> 300..1000),并且磁盘驱动器不是很快,那么我无法获得可靠加载完整文件列表的代码。首先它加载一些文件(如10或100,取决于月亮位置)。接下来的尝试(运行相同的代码)稍微多一点,例如200,但不能保证这个数字会增长。

我尝试了很多变体,包括:

res = new List<StorageFile>(await query.GetFilesAsync());

public async static Task<List<StorageFile>> GetFilesInChunks(
    this StorageFileQueryResult query)
{
        List<StorageFile> res = new List<StorageFile>();
        List<StorageFile> chunk = null;
        uint chunkSize = 200;
        bool isLastChance = false;

        try
        {
            for (uint startIndex = 0; startIndex < 1000000;)
            {
                var files = await query.GetFilesAsync(startIndex, chunkSize);
                chunk = new List<StorageFile>(files);

                res.AddRange(chunk);

                if (chunk.Count == 0)
                {
                    if (isLastChance)
                        break;
                    else
                    {
                        /// pretty awkward attempt to rebuild the query, but this doesn't help too much :)                          
                        await query.GetFilesAsync(0, 1);

                        isLastChance = true;
                    }
                }
                else
                    isLastChance = false;

                startIndex += (uint)chunk.Count;
            }
        }
        catch
        {
        }

        return res;
    }

这段代码看起来有点复杂,但我已经尝试过更简单的变体:(

很高兴能得到你的帮助..

1 个答案:

答案 0 :(得分:0)

  

如何从文件夹中可靠地获取文件?

枚举大量文件的推荐方法是使用GetFilesAsync上的批处理功能在需要时在文件组中进行分页。这样,您的应用程序可以在等待创建下一组文件时对文件进行后台处理。

示例

uint index = 0, stepSize = 10;
IReadOnlyList<StorageFile> files = await queryResult.GetFilesAsync(index, stepSize);
index += 10;   
while (files.Count != 0)
{
  var fileTask = queryResult.GetFilesAsync(index, stepSize).AsTask();
  foreach (StorageFile file in files)
  {
    // Do the background processing here   
  }
  files = await fileTask;
  index += 10;
}

您所做的StorageFileQueryResult扩展方法与上述类似。

但是,获取文件的可靠性并不依赖于上述内容,而是取决于QueryOptions

options.IndexerOption = IndexerOption.OnlyUseIndexer;

如果您使用OnlyUseIndexer,它会很快查询。但查询结果可能不完整。原因是某些文件尚未在系统中编入索引。

options.IndexerOption = IndexerOption.DoNotUseIndexer;

如果您使用DoNotUseIndexer,它会慢慢查询。查询结果完成。

此博客详细讲述了Accelerate File Operations with the Search Indexer。请参阅。